{"id":28493500,"url":"https://github.com/tinder/combineui","last_synced_at":"2026-02-20T22:01:04.262Z","repository":{"id":274587212,"uuid":"628015035","full_name":"Tinder/CombineUI","owner":"Tinder","description":"Swift Property Wrappers, Bindings and Combine Publishers for UI Gestures, Controls and Views","archived":false,"fork":false,"pushed_at":"2026-02-18T17:06:35.000Z","size":629,"stargazers_count":12,"open_issues_count":1,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-18T20:37:26.162Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tinder.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-04-14T17:54:47.000Z","updated_at":"2026-01-23T16:54:02.000Z","dependencies_parsed_at":"2026-02-18T19:08:46.018Z","dependency_job_id":null,"html_url":"https://github.com/Tinder/CombineUI","commit_stats":null,"previous_names":["tinder/combineui"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/Tinder/CombineUI","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tinder%2FCombineUI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tinder%2FCombineUI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tinder%2FCombineUI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tinder%2FCombineUI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tinder","download_url":"https://codeload.github.com/Tinder/CombineUI/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tinder%2FCombineUI/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29666413,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-20T19:49:36.704Z","status":"ssl_error","status_checked_at":"2026-02-20T19:44:05.372Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-08T09:09:10.552Z","updated_at":"2026-02-20T22:01:04.255Z","avatar_url":"https://github.com/Tinder.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Swift](https://github.com/Tinder/CombineUI/actions/workflows/swift.yml/badge.svg?event=push)](https://github.com/Tinder/CombineUI/actions/workflows/swift.yml)\n\u0026nbsp;\n[![DocC](https://github.com/Tinder/CombineUI/actions/workflows/docc.yml/badge.svg?event=push)](https://github.com/Tinder/CombineUI/actions/workflows/docc.yml)\n\n# CombineUI\n\nSwift Property Wrappers, Bindings and Combine Publishers for UI Gestures, Controls and Views\n\n## Overview\n\nCombineUI provides [Swift property wrappers](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/properties/#Property-Wrappers) for select Apple types such as gestures, controls and views. These property wrappers [project](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/properties/#Projecting-a-Value-From-a-Property-Wrapper) Combine publishers for gesture recognition, control events, property changes and delegate callbacks.\n\nExample:\n\n```swift\n@Button var button = UIButton()\n```\n\n\u003e The `$button` projected value is a publisher that will send when the button is tapped.\n\nAnd bindings are provided for updating properties of select Apple views with values from Combine publishers.\n\n- The property wrappers are for __*publishing*__ (i.e. to publish a value when a UI element changes).\n- The bindings are for __*subscribing*__ (i.e. to update a UI element with a published value).\n\n### Bindings Benefits\n\nAs compared to subscribing via Combine's' [`assign(to:on:)`](https://developer.apple.com/documentation/combine/publisher/assign(to:on:)) method, subscribing via CombineUI's bindings is preferable since they use `weak` references and can accept method arguments.\n\nExample:\n\n```swift\npublisher.bind(to: button.bindable.title(for: .normal))\n```\n\n### Swift Extensions\n\nMany types are also enhanced with Swift extensions providing Combine publishers that may be used as an alternative to the property wrappers when needed.\n\n### Supported UI Frameworks\n\nUIKit is currently supported. CombineUI may support additional UI frameworks in the future.\n\n## Installation\n\n### Swift Package Collection\n\n\u003cdetails\u003e\u003csummary\u003eExpand / Collapse\u003c/summary\u003e\u003cbr\u003e\n\n```\nhttps://swiftpackageindex.com/Tinder/collection.json\n```\n\n\u003c/details\u003e\n\n### Swift Package Manager\n\n\u003cdetails\u003e\u003csummary\u003eExpand / Collapse\u003c/summary\u003e\u003cbr\u003e\n\n**Package Dependency**\n\n\u003e Replace `\u003cversion\u003e` with the desired minimum version.\n\n```swift\n.package(url: \"https://github.com/Tinder/CombineUI.git\", from: \"\u003cversion\u003e\")\n```\n\n**Target Dependency**\n\n```swift\n\"CombineUI\"\n```\n\n\u003c/details\u003e\n\n### Xcode\n\n\u003cdetails\u003e\u003csummary\u003eExpand / Collapse\u003c/summary\u003e\u003cbr\u003e\n\n**Package Dependency**\n\n```\nhttps://github.com/Tinder/CombineUI.git\n```\n\n**Target Dependency**\n\n```\nCombineUI\n```\n\n\u003c/details\u003e\n\n## Code Examples\n\nAll examples require this setup:\n\n```swift\nimport Combine\nimport CombineUI\nimport UIKit\n\nvar cancellables = Set\u003cAnyCancellable\u003e()\n```\n\n### Property Wrapper Example: `UIButton`\n\n```swift\n@Button var button = UIButton()\n\nbutton.setImage(UIImage(systemName: \"heart\"), for: .normal)\n\n$button\n    .sink { print(\"Tapped\") }\n    .store(in: \u0026cancellables)\n```\n\n### Binding Example: `UILabel`\n\n```swift\nlet label = UILabel()\nlet subject = PassthroughSubject\u003cString, Never\u003e()\n\nsubject\n    .bind(to: label.bindable.text)\n    .store(in: \u0026cancellables)\n\nsubject.send(\"Text\")\n```\n\n### Extension Methods Example: `UIViewController`\n\n```swift\nlet viewController = UIViewController()\n\nlet lifecycle = viewController\n    .lifecyclePublisher()\n    .share()\n\nlifecycle\n    .sink { print($0) } // .viewWillAppear | .viewDidAppear | .viewWillDisappear | .viewDidDisappear\n    .store(in: \u0026cancellables)\n\nlifecycle\n    .isVisiblePublisher()\n    .sink { print($0) } // true | false\n    .store(in: \u0026cancellables)\n```\n\n### Comprehensive Examples\n\nAdditional examples are available within [an Xcode project included in this repository](Example/). See the [example project README containing setup instructions](Example/) for guidance.\n\n\u003cimg src=\"Example/Examples.png\" width=\"234\" /\u003e\n\n## Cheat Sheets\n\n### UIKit\n\nProperty Wrappers\n\n| | Property Wrapper | Projected Type |\n| :-- | :-- | :-- |\n| `UIButton` | `@Button` | `AnyPublisher\u003cVoid, Never\u003e` \u003ctr\u003e\u003c/tr\u003e |\n| `UIControl` | `@Control` | `ControlInterface` \u003ctr\u003e\u003c/tr\u003e |\n| `UIDatePicker` | `@DatePicker` | `DatePickerInterface` \u003ctr\u003e\u003c/tr\u003e |\n| `UIGestureRecognizer` | `@GestureRecognizer` | `GestureRecognizerInterface` \u003ctr\u003e\u003c/tr\u003e |\n| `UIPageControl` | `@PageControl` | `AnyPublisher\u003cInt, Never\u003e` \u003ctr\u003e\u003c/tr\u003e |\n| `UIRefreshControl` | `@RefreshControl` | `AnyPublisher\u003cVoid, Never\u003e` \u003ctr\u003e\u003c/tr\u003e |\n| `UIScrollView` | `@ScrollView` | `ScrollViewInterface` \u003ctr\u003e\u003c/tr\u003e |\n| `UISearchBar` | `@SearchBar` | `SearchBarInterface` \u003ctr\u003e\u003c/tr\u003e |\n| `UISegmentedControl` | `@SegmentedControl` | `AnyPublisher\u003cInt, Never\u003e` \u003ctr\u003e\u003c/tr\u003e |\n| `UISlider` | `@Slider` | `AnyPublisher\u003cFloat, Never\u003e` \u003ctr\u003e\u003c/tr\u003e |\n| `UIStepper` | `@Stepper` | `AnyPublisher\u003cDouble, Never\u003e` \u003ctr\u003e\u003c/tr\u003e |\n| `UISwitch` | `@Switch` | `AnyPublisher\u003cBool, Never\u003e` \u003ctr\u003e\u003c/tr\u003e |\n| `UITextField` | `@TextField` | `TextFieldInterface` \u003ctr\u003e\u003c/tr\u003e |\n| `UITextView` | `@TextView` | `TextViewInterface` \u003ctr\u003e\u003c/tr\u003e |\n| `UIViewController` | `@ViewController` | `ViewControllerInterface` \u003ctr\u003e\u003c/tr\u003e |\n\nBindings\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth align=\"left\"\u003e\u003c/th\u003e\n      \u003cth align=\"left\"\u003eBinding\u003c/th\u003e\n      \u003cth align=\"left\"\u003eType\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"7\"\u003e\u003ccode\u003eUIActivityIndicatorView\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003estyle\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIActivityIndicatorView.Style\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ecolor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ehidesWhenStopped\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eisAnimating\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"11\"\u003e\u003ccode\u003eUIButton\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003etitleColor(for: UIControl.State)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003etitleShadowColor(for: UIControl.State)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003etitle(for: UIControl.State)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eString\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eattributedTitle(for: UIControl.State)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAttributedString\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eimage(for: UIControl.State)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIImage?\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ebackgroundImage(for: UIControl.State)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIImage?\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eUIControl\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eisEnabled\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"5\"\u003e\u003ccode\u003eUIDatePicker\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003ecountDownDuration\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eTimeInterval\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003edate\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eDate\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003edate(animated: Bool)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eDate\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eUIGestureRecognizer\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eisEnabled\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"5\"\u003e\u003ccode\u003eUIImageView\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eimage\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIImage?\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ehighlightedImage\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIImage?\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eisHighlighted\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"9\"\u003e\u003ccode\u003eUILabel\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eisEnabled\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003efont\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIFont\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003etextColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003etext\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eString\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eattributedText\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAttributedString\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"9\"\u003e\u003ccode\u003eUIPageControl\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003epageIndicatorTintColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ecurrentPageIndicatorTintColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ecurrentPage\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003enumberOfPages\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ehidesForSinglePage\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"7\"\u003e\u003ccode\u003eUIProgressView\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003etrackTintColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eprogressTintColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eprogress\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eFloat\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eprogress(animated: Bool)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eFloat\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"5\"\u003e\u003ccode\u003eUIRefreshControl\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003etintColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eattributedTitle\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAttributedString\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eisRefreshing\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"11\"\u003e\u003ccode\u003eUISegmentedControl\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eisMomentary\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eselectedSegmentIndex\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eisEnabledForSegment(at: Int)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ewidthForSegment(at: Int)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eCGFloat\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003etitleForSegment(at: Int)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eString\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eimageForSegment(at: Int)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIImage?\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"15\"\u003e\u003ccode\u003eUISlider\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eisContinuous\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eminimumValue\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eFloat\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003emaximumValue\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eFloat\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eminimumTrackTintColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003emaximumTrackTintColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ethumbTintColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003evalue\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eFloat\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003evalue(animated: Bool)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eFloat\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"13\"\u003e\u003ccode\u003eUIStepper\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eisContinuous\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eautorepeat\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ewraps\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eminimumValue\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eDouble\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003emaximumValue\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eDouble\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003estepValue\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eDouble\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003evalue\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eDouble\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"7\"\u003e\u003ccode\u003eUISwitch\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eonTintColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ethumbTintColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eisOn\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eisOn(animated: Bool)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"13\"\u003e\u003ccode\u003eUITextField\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003efont\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIFont\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003etextColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003etextAlignment\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eNSTextAlignment\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eplaceholder\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eString\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eattributedPlaceholder\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAttributedString\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003etext\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eString\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eattributedText\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAttributedString\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"11\"\u003e\u003ccode\u003eUITextView\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eisEditable\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003efont\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIFont\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003etextColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003etextAlignment\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eNSTextAlignment\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003etext\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eString\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eattributedText\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAttributedString\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"21\"\u003e\u003ccode\u003eUIView\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eisUserInteractionEnabled\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eisMultipleTouchEnabled\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eisExclusiveTouch\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eclipsToBounds\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003etintColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ebackgroundColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eborderColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eshadowColor\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eUIColor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ealpha\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eCGFloat\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eisOpaque\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eisHidden\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\nExtension Methods\n\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n        \u003cth align=\"left\"\u003e\u003c/th\u003e\n        \u003cth align=\"left\"\u003eMethod\u003c/th\u003e\n        \u003cth align=\"left\"\u003eType\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eUIButton\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003etapPublisher()\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyPublisher\u0026lt;Void, Never\u0026gt;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eUIControl\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003epublisher(for: UIControl.Event)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyPublisher\u0026lt;UIControl.Event, Never\u0026gt;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"3\"\u003e\u003ccode\u003eUIDatePicker\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003ecountDownDurationPublisher()\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyPublisher\u0026lt;TimeInterval, Never\u0026gt;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003edatePublisher()\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyPublisher\u0026lt;Date, Never\u0026gt;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eUIGestureRecognizer\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003epublisher(attachingTo: UIView)\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyPublisher\u0026lt;UIGestureRecognizer, Never\u0026gt;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eUIPageControl\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003ecurrentPagePublisher()\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyPublisher\u0026lt;Int, Never\u0026gt;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eUIRefreshControl\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003erefreshPublisher()\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyPublisher\u0026lt;Void, Never\u0026gt;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eUISegmentedControl\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eselectedSegmentIndexPublisher()\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyPublisher\u0026lt;Int, Never\u0026gt;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eUISlider\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003evaluePublisher()\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyPublisher\u0026lt;Float, Never\u0026gt;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eUIStepper\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003evaluePublisher()\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyPublisher\u0026lt;Double, Never\u0026gt;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eUISwitch\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eisOnPublisher()\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyPublisher\u0026lt;Bool, Never\u0026gt;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd rowspan=\"3\"\u003e\u003ccode\u003eUITextField\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003etextPublisher()\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyPublisher\u0026lt;String, Never\u0026gt;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eattributedTextPublisher()\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyPublisher\u0026lt;AttributedString, Never\u0026gt;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003eUIViewController\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003elifecyclePublisher()\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyPublisher\u0026lt;ViewControllerLifecycleEvent, Never\u0026gt;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ccode\u003ePublisher where Output == ViewControllerLifecycleEvent\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eisVisiblePublisher()\u003c/code\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyPublisher\u0026lt;Bool, Never\u0026gt;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n## Documentation\n\n- UIKit\n  - [UIActivityIndicatorView](#uiactivityindicatorview)\n  - [UIButton](#uibutton)\n  - [UIControl](#uicontrol)\n  - [UIDatePicker](#uidatepicker)\n  - [UIGestureRecognizer](#uigesturerecognizer)\n  - [UIImageView](#uiimageview)\n  - [UILabel](#uilabel)\n  - [UIPageControl](#uipagecontrol)\n  - [UIProgressView](#uiprogressview)\n  - [UIRefreshControl](#uirefreshcontrol)\n  - [UIScrollView](#uiscrollview)\n  - [UISearchBar](#uisearchbar)\n  - [UISegmentedControl](#uisegmentedcontrol)\n  - [UISlider](#uislider)\n  - [UIStepper](#uistepper)\n  - [UISwitch](#uiswitch)\n  - [UITextField](#uitextfield)\n  - [UITextView](#uitextview)\n  - [UIView](#uiview)\n  - [UIViewController](#uiviewcontroller)\n- [Caveats](#caveats)\n- [Customization](#customization)\n\n## `UIActivityIndicatorView`\n\n### Bindings\n\n```swift\nvar style: Binding\u003cUIActivityIndicatorView.Style\u003e\nvar color: Binding\u003cUIColor\u003e\nvar hidesWhenStopped: Binding\u003cBool\u003e\nvar isAnimating: Binding\u003cBool\u003e\n```\n\n### Code Example\n\n```swift\nlet activityIndicatorView = UIActivityIndicatorView()\n\nJust(.medium)\n    .bind(to: activityIndicatorView.bindable.style)\n    .store(in: \u0026cancellables)\n\nJust(.systemPink)\n    .bind(to: activityIndicatorView.bindable.color)\n    .store(in: \u0026cancellables)\n\nJust(true)\n    .bind(to: activityIndicatorView.bindable.hidesWhenStopped)\n    .store(in: \u0026cancellables)\n\nJust(true)\n    .bind(to: activityIndicatorView.bindable.isAnimating)\n    .store(in: \u0026cancellables)\n```\n\n## `UIButton`\n\n| Event |\n| :-- |\n| `.primaryActionTriggered` \u003ctr\u003e\u003c/tr\u003e |\n\n### Property Wrapper\n\n```swift\n@Button // Projected Value: AnyPublisher\u003cVoid, Never\u003e\n```\n\n### Bindings\n\n```swift\nfunc titleColor(for state: UIControl.State) -\u003e Binding\u003cUIColor\u003e\nfunc titleShadowColor(for state: UIControl.State) -\u003e Binding\u003cUIColor\u003e\nfunc title(for state: UIControl.State) -\u003e Binding\u003cString\u003e\nfunc attributedTitle(for state: UIControl.State) -\u003e Binding\u003cAttributedString\u003e\nfunc image(for state: UIControl.State) -\u003e Binding\u003cUIImage?\u003e\nfunc backgroundImage(for state: UIControl.State) -\u003e Binding\u003cUIImage?\u003e\n```\n\n### Extension Method\n\n```swift\nfunc tapPublisher() -\u003e AnyPublisher\u003cVoid, Never\u003e\n```\n\n### Code Example\n\n```swift\n// Property Wrapper\n\n@Button var button = UIButton()\n\nbutton.setImage(UIImage(systemName: \"heart\"), for: .normal)\n\n$button\n    .sink { print(\"Tapped\") }\n    .store(in: \u0026cancellables)\n\n// Bindings\n\nJust(.systemPink)\n    .bind(to: button.bindable.titleColor(for: .normal))\n    .store(in: \u0026cancellables)\n\nJust(.systemPink)\n    .bind(to: button.bindable.titleShadowColor(for: .normal))\n    .store(in: \u0026cancellables)\n\nJust(\"Title\")\n    .bind(to: button.bindable.title(for: .normal))\n    .store(in: \u0026cancellables)\n\nJust(AttributedString(\"Title\"))\n    .bind(to: button.bindable.attributedTitle(for: .normal))\n    .store(in: \u0026cancellables)\n\nJust(.checkmark)\n    .bind(to: button.bindable.image(for: .normal))\n    .store(in: \u0026cancellables)\n\nJust(.checkmark)\n    .bind(to: button.bindable.backgroundImage(for: .normal))\n    .store(in: \u0026cancellables)\n\n// Extension Method\n\nbutton\n    .tapPublisher()\n    .sink { print(\"Tapped\") }\n    .store(in: \u0026cancellables)\n```\n\n## `UIControl`\n\n### Property Wrapper\n\n```swift\n@Control // Projected Value: ControlInterface\n```\n\n`ControlInterface`\n\n```swift\nvar touchDown: AnyPublisher\u003cVoid, Never\u003e\nvar touchDownRepeat: AnyPublisher\u003cVoid, Never\u003e\nvar touchDragInside: AnyPublisher\u003cVoid, Never\u003e\nvar touchDragOutside: AnyPublisher\u003cVoid, Never\u003e\nvar touchDragEnter: AnyPublisher\u003cVoid, Never\u003e\nvar touchDragExit: AnyPublisher\u003cVoid, Never\u003e\nvar touchUpInside: AnyPublisher\u003cVoid, Never\u003e\nvar touchUpOutside: AnyPublisher\u003cVoid, Never\u003e\nvar touchCancel: AnyPublisher\u003cVoid, Never\u003e\nvar valueChanged: AnyPublisher\u003cVoid, Never\u003e\nvar menuActionTriggered: AnyPublisher\u003cVoid, Never\u003e\nvar primaryActionTriggered: AnyPublisher\u003cVoid, Never\u003e\nvar editingDidBegin: AnyPublisher\u003cVoid, Never\u003e\nvar editingChanged: AnyPublisher\u003cVoid, Never\u003e\nvar editingDidEnd: AnyPublisher\u003cVoid, Never\u003e\nvar editingDidEndOnExit: AnyPublisher\u003cVoid, Never\u003e\n```\n\n### Binding\n\n```swift\nvar isEnabled: Binding\u003cBool\u003e\n```\n\n### Extension Method\n\n```swift\nfunc publisher(for controlEvents: UIControl.Event) -\u003e AnyPublisher\u003cUIControl.Event, Never\u003e\n```\n\n\u003e Use [`contains()`](https://developer.apple.com/documentation/swift/setalgebra/contains(_:)-5usmy) on the [OptionSet](https://developer.apple.com/documentation/swift/optionset) that is received to determine which event occurred.\n\n### Supported Types\n\nJust as every CombineUI property wrapper and binding may be used with subclasses of their supported type, the `UIControl` property wrapper and binding are compatible with `UIControl` subclasses, including (but not limited to) the following:\n\n  - `UIButton`\n  - `UIDatePicker`\n  - `UIPageControl`\n  - `UIRefreshControl`\n  - `UISegmentedControl`\n  - `UISlider`\n  - `UIStepper`\n  - `UISwitch`\n  - `UITextField`\n\n### Code Example\n\n```swift\n// Property Wrapper\n\n@Control var control = UIButton()\n\ncontrol.setImage(UIImage(systemName: \"heart\"), for: .normal)\n\n$control\n    .primaryActionTriggered\n    .sink { print(\"Triggered\") }\n    .store(in: \u0026cancellables)\n\n// Binding\n\nJust(true)\n    .bind(to: control.bindable.isEnabled)\n    .store(in: \u0026cancellables)\n\n// Extension Method\n\ncontrol\n    .publisher(for: .primaryActionTriggered)\n    .sink { controlEvents in }\n    .store(in: \u0026cancellables)\n```\n\n### Notes\n\n- Use the `@Control` property wrapper only when publishers for the `UIControl.Event` types are needed, otherwise the type specific property wrappers should be preferred.\n\n## `UIDatePicker`\n\n| Property | Event |\n| :-- | :-- |\n| `.countDownDuration` | `.valueChanged` \u003ctr\u003e\u003c/tr\u003e |\n| `.date` | `.valueChanged` \u003ctr\u003e\u003c/tr\u003e |\n\n### Property Wrapper\n\n```swift\n@DatePicker(mode: UIDatePicker.Mode = .dateAndTime) // Projected Value: DatePickerInterface\n```\n\n`DatePickerInterface`\n\n```swift\nvar countDownDuration: AnyPublisher\u003cTimeInterval, Never\u003e\nvar date: AnyPublisher\u003cDate, Never\u003e\n```\n\n### Bindings\n\n```swift\nvar countDownDuration: Binding\u003cTimeInterval\u003e\nvar date: Binding\u003cDate\u003e\n\nfunc date(animated: Bool) -\u003e Binding\u003cDate\u003e\n```\n\n### Extension Methods\n\n```swift\nfunc datePublisher() -\u003e AnyPublisher\u003cDate, Never\u003e\nfunc countDownDurationPublisher() -\u003e AnyPublisher\u003cTimeInterval, Never\u003e\n```\n\n### Code Example\n\n```swift\n// Property Wrapper\n\n@DatePicker(mode: .countDownTimer)\nvar datePicker1 = UIDatePicker()\n\n@DatePicker var datePicker2 = UIDatePicker()\n\n$datePicker1\n    .countDownDuration\n    .sink { countDownDuration in }\n    .store(in: \u0026cancellables)\n\n$datePicker2\n    .date\n    .sink { date in }\n    .store(in: \u0026cancellables)\n\n// Bindings\n\nJust(60)\n    .bind(to: datePicker1.bindable.countDownDuration)\n    .store(in: \u0026cancellables)\n\nJust(Date())\n    .bind(to: datePicker2.bindable.date)\n    .store(in: \u0026cancellables)\n\nJust(Date())\n    .bind(to: datePicker2.bindable.date(animated: true))\n    .store(in: \u0026cancellables)\n\n// Extension Methods\n\ndatePicker1\n    .countDownDurationPublisher()\n    .sink { countDownDuration in }\n    .store(in: \u0026cancellables)\n\ndatePicker2\n    .datePublisher()\n    .sink { date in }\n    .store(in: \u0026cancellables)\n```\n\n## `UIGestureRecognizer`\n\n### Property Wrapper\n\n```swift\n@GestureRecognizer // Projected Value: GestureRecognizerInterface\n```\n\n`GestureRecognizerInterface`\n\n```swift\nfunc attaching(to view: UIView) -\u003e AnyPublisher\u003cUIGestureRecognizer, Never\u003e\n```\n\n### Binding\n\n```swift\nvar isEnabled: Binding\u003cBool\u003e\n```\n\n### Extension Method\n\n```swift\nfunc publisher(attachingTo view: UIView) -\u003e AnyPublisher\u003cUIGestureRecognizer, Never\u003e\n```\n\n### Code Example\n\n```swift\n// Property Wrapper\n\n@GestureRecognizer var swipe = UISwipeGestureRecognizer()\n\n$swipe\n    .attaching(to: view)\n    .sink { swipe in }\n    .store(in: \u0026cancellables)\n\n// Binding\n\nJust(true)\n    .bind(to: swipe.bindable.isEnabled)\n    .store(in: \u0026cancellables)\n\n// Extension Method\n\nswipe\n    .publisher(attachingTo: view)\n    .sink { swipe in }\n    .store(in: \u0026cancellables)\n```\n\n### Notes\n\n- The gesture recognizer will be added to the provided view automatically.\n\n## `UIImageView`\n\n### Bindings\n\n```swift\nvar image: Binding\u003cUIImage?\u003e\nvar highlightedImage: Binding\u003cUIImage?\u003e\nvar isHighlighted: Binding\u003cBool\u003e\n```\n\n### Code Example\n\n```swift\nlet imageView = UIImageView()\n\nJust(.checkmark)\n    .bind(to: imageView.bindable.image)\n    .store(in: \u0026cancellables)\n\nJust(.checkmark)\n    .bind(to: imageView.bindable.highlightedImage)\n    .store(in: \u0026cancellables)\n\nJust(true)\n    .bind(to: imageView.bindable.isHighlighted)\n    .store(in: \u0026cancellables)\n```\n\n## `UILabel`\n\n### Bindings\n\n```swift\nvar isEnabled: Binding\u003cBool\u003e\nvar font: Binding\u003cUIFont\u003e\nvar textColor: Binding\u003cUIColor\u003e\nvar text: Binding\u003cString\u003e\nvar attributedText: Binding\u003cAttributedString\u003e\n```\n\n### Code Example\n\n```swift\nlet label = UILabel()\n\nJust(true)\n    .bind(to: label.bindable.isEnabled)\n    .store(in: \u0026cancellables)\n\nJust(.preferredFont(forTextStyle: .body))\n    .bind(to: label.bindable.font)\n    .store(in: \u0026cancellables)\n\nJust(.systemPink)\n    .bind(to: label.bindable.textColor)\n    .store(in: \u0026cancellables)\n\nJust(\"Text\")\n    .bind(to: label.bindable.text)\n    .store(in: \u0026cancellables)\n\nJust(AttributedString(\"Text\"))\n    .bind(to: label.bindable.attributedText)\n    .store(in: \u0026cancellables)\n```\n\n## `UIPageControl`\n\n| Property | Event |\n| :-- | :-- |\n| `.currentPage` | `.valueChanged` \u003ctr\u003e\u003c/tr\u003e |\n\n### Property Wrapper\n\n```swift\n@PageControl // Projected Value: AnyPublisher\u003cInt, Never\u003e\n```\n\n### Bindings\n\n```swift\nvar pageIndicatorTintColor: Binding\u003cUIColor\u003e\nvar currentPageIndicatorTintColor: Binding\u003cUIColor\u003e\nvar currentPage: Binding\u003cInt\u003e\nvar numberOfPages: Binding\u003cInt\u003e\nvar hidesForSinglePage: Binding\u003cBool\u003e\n```\n\n### Extension Method\n\n```swift\nfunc currentPagePublisher() -\u003e AnyPublisher\u003cInt, Never\u003e\n```\n\n### Code Example\n\n```swift\n// Property Wrapper\n\n@PageControl var pageControl = UIPageControl()\n\n$pageControl\n    .sink { currentPage in }\n    .store(in: \u0026cancellables)\n\n// Bindings\n\nJust(.systemPink)\n    .bind(to: pageControl.bindable.pageIndicatorTintColor)\n    .store(in: \u0026cancellables)\n\nJust(.systemPink)\n    .bind(to: pageControl.bindable.currentPageIndicatorTintColor)\n    .store(in: \u0026cancellables)\n\nJust(1)\n    .bind(to: pageControl.bindable.currentPage)\n    .store(in: \u0026cancellables)\n\nJust(1)\n    .bind(to: pageControl.bindable.numberOfPages)\n    .store(in: \u0026cancellables)\n\nJust(true)\n    .bind(to: pageControl.bindable.hidesForSinglePage)\n    .store(in: \u0026cancellables)\n\n// Extension Method\n\npageControl\n    .currentPagePublisher()\n    .sink { currentPage in }\n    .store(in: \u0026cancellables)\n```\n\n## `UIProgressView`\n\n### Bindings\n\n```swift\nvar trackTintColor: Binding\u003cUIColor\u003e\nvar progressTintColor: Binding\u003cUIColor\u003e\nvar progress: Binding\u003cFloat\u003e\n\nfunc progress(animated: Bool) -\u003e Binding\u003cFloat\u003e\n```\n\n### Code Example\n\n```swift\nlet progressView = UIProgressView()\n\nJust(.systemPink)\n    .bind(to: progressView.bindable.trackTintColor)\n    .store(in: \u0026cancellables)\n\nJust(.systemPink)\n    .bind(to: progressView.bindable.progressTintColor)\n    .store(in: \u0026cancellables)\n\nJust(1)\n    .bind(to: progressView.bindable.progress)\n    .store(in: \u0026cancellables)\n\nJust(1)\n    .bind(to: progressView.bindable.progress(animated: true))\n    .store(in: \u0026cancellables)\n```\n\n## `UIRefreshControl`\n\n| Property | Event | Value |\n| :-- | :-- | :-- |\n| `.isRefreshing` | `.valueChanged` | `true` \u003ctr\u003e\u003c/tr\u003e |\n\n### Property Wrapper\n\n```swift\n@RefreshControl // Projected Value: AnyPublisher\u003cVoid, Never\u003e\n```\n\n### Bindings\n\n```swift\nvar tintColor: Binding\u003cUIColor\u003e\nvar attributedTitle: Binding\u003cAttributedString\u003e\nvar isRefreshing: Binding\u003cBool\u003e\n```\n\n### Extension Method\n\n```swift\nfunc refreshPublisher() -\u003e AnyPublisher\u003cVoid, Never\u003e\n```\n\n### Code Example\n\n```swift\n// Property Wrapper\n\n@RefreshControl var refreshControl = UIRefreshControl()\n\n$refreshControl\n    .sink { print(\"Refreshing\") }\n    .store(in: \u0026cancellables)\n\n// Bindings\n\nJust(.systemPink)\n    .bind(to: refreshControl.bindable.tintColor)\n    .store(in: \u0026cancellables)\n\nJust(AttributedString(\"Title\"))\n    .bind(to: refreshControl.bindable.attributedTitle)\n    .store(in: \u0026cancellables)\n\nJust(true)\n    .bind(to: refreshControl.bindable.isRefreshing)\n    .store(in: \u0026cancellables)\n\n// Extension Method\n\nrefreshControl\n    .refreshPublisher()\n    .sink { print(\"Refreshing\") }\n    .store(in: \u0026cancellables)\n```\n\n## `UIScrollView`\n\n| Protocol |\n| :-- |\n| `UIScrollViewDelegate` \u003ctr\u003e\u003c/tr\u003e |\n\n### Property Wrapper\n\n```swift\n@ScrollView // Projected Value: ScrollViewInterface\n```\n\n`ScrollViewInterface`\n\n```swift\nvar didScroll: AnyPublisher\u003cVoid, Never\u003e\nvar didZoom: AnyPublisher\u003cVoid, Never\u003e\nvar willBeginDragging: AnyPublisher\u003cVoid, Never\u003e\nvar willEndDragging: AnyPublisher\u003cScrollViewWillEndDragging, Never\u003e\nvar didEndDragging: AnyPublisher\u003cBool, Never\u003e\nvar willBeginDecelerating: AnyPublisher\u003cVoid, Never\u003e\nvar didEndDecelerating: AnyPublisher\u003cVoid, Never\u003e\nvar didEndScrollingAnimation: AnyPublisher\u003cVoid, Never\u003e\nvar willBeginZooming: AnyPublisher\u003cUIView?, Never\u003e\nvar didEndZooming: AnyPublisher\u003cScrollViewDidEndZooming, Never\u003e\nvar didScrollToTop: AnyPublisher\u003cVoid, Never\u003e\nvar didChangeAdjustedContentInset: AnyPublisher\u003cVoid, Never\u003e\n```\n\n### Code Example\n\n```swift\n@ScrollView var scrollView = UIScrollView()\n\n$scrollView\n    .didScroll\n    .sink { print(\"Scrolling\") }\n    .store(in: \u0026cancellables)\n```\n\n## `UISearchBar`\n\n| Protocol |\n| :-- |\n| `UISearchBarDelegate` \u003ctr\u003e\u003c/tr\u003e |\n\n### Property Wrapper\n\n```swift\n@SearchBar // Projected Value: SearchBarInterface\n```\n\n`SearchBarInterface`\n\n```swift\nvar textDidBeginEditing: AnyPublisher\u003cVoid, Never\u003e\nvar textDidEndEditing: AnyPublisher\u003cVoid, Never\u003e\nvar textDidChange: AnyPublisher\u003cString, Never\u003e\nvar searchButtonClicked: AnyPublisher\u003cVoid, Never\u003e\nvar bookmarkButtonClicked: AnyPublisher\u003cVoid, Never\u003e\nvar cancelButtonClicked: AnyPublisher\u003cVoid, Never\u003e\nvar resultsListButtonClicked: AnyPublisher\u003cVoid, Never\u003e\nvar selectedScopeButtonIndexDidChange: AnyPublisher\u003cInt, Never\u003e\n```\n\n### Code Example\n\n```swift\n@SearchBar var searchBar = UISearchBar()\n\n$searchBar\n    .textDidChange\n    .sink { text in }\n    .store(in: \u0026cancellables)\n```\n\n## `UISegmentedControl`\n\n| Property | Event |\n| :-- | :-- |\n| `.selectedSegmentIndex` | `.valueChanged` \u003ctr\u003e\u003c/tr\u003e |\n\n### Property Wrapper\n\n```swift\n@SegmentedControl // Projected Value: AnyPublisher\u003cInt, Never\u003e\n```\n\n### Bindings\n\n```swift\nvar isMomentary: Binding\u003cBool\u003e\nvar selectedSegmentIndex: Binding\u003cInt\u003e\n\nfunc isEnabledForSegment(at index: Int) -\u003e Binding\u003cBool\u003e\nfunc widthForSegment(at index: Int) -\u003e Binding\u003cCGFloat\u003e\nfunc titleForSegment(at index: Int) -\u003e Binding\u003cString\u003e\nfunc imageForSegment(at index: Int) -\u003e Binding\u003cUIImage?\u003e\n```\n\n### Extension Method\n\n```swift\nfunc selectedSegmentIndexPublisher() -\u003e AnyPublisher\u003cInt, Never\u003e\n```\n\n### Code Example\n\n```swift\n// Property Wrapper\n\n@SegmentedControl var segmentedControl = UISegmentedControl(items: items)\n\n$segmentedControl\n    .sink { selectedSegmentIndex in }\n    .store(in: \u0026cancellables)\n\n// Bindings\n\nJust(true)\n    .bind(to: segmentedControl.bindable.isMomentary)\n    .store(in: \u0026cancellables)\n\nJust(1)\n    .bind(to: segmentedControl.bindable.selectedSegmentIndex)\n    .store(in: \u0026cancellables)\n\nJust(true)\n    .bind(to: segmentedControl.bindable.isEnabledForSegment(at: 1))\n    .store(in: \u0026cancellables)\n\nJust(100)\n    .bind(to: segmentedControl.bindable.widthForSegment(at: 1))\n    .store(in: \u0026cancellables)\n\nJust(\"Title\")\n    .bind(to: segmentedControl.bindable.titleForSegment(at: 1))\n    .store(in: \u0026cancellables)\n\nJust(.checkmark)\n    .bind(to: segmentedControl.bindable.imageForSegment(at: 1))\n    .store(in: \u0026cancellables)\n\n// Extension Method\n\nsegmentedControl\n    .selectedSegmentIndexPublisher()\n    .sink { selectedSegmentIndex in }\n    .store(in: \u0026cancellables)\n```\n\n## `UISlider`\n\n| Property | Event |\n| :-- | :-- |\n| `.value` | `.valueChanged` \u003ctr\u003e\u003c/tr\u003e |\n\n### Property Wrapper\n\n```swift\n@Slider // Projected Value: AnyPublisher\u003cFloat, Never\u003e\n```\n\n### Bindings\n\n```swift\nvar isContinuous: Binding\u003cBool\u003e\nvar minimumValue: Binding\u003cFloat\u003e\nvar maximumValue: Binding\u003cFloat\u003e\nvar minimumTrackTintColor: Binding\u003cUIColor\u003e\nvar maximumTrackTintColor: Binding\u003cUIColor\u003e\nvar thumbTintColor: Binding\u003cUIColor\u003e\nvar value: Binding\u003cFloat\u003e\n\nfunc value(animated: Bool) -\u003e Binding\u003cFloat\u003e\n```\n\n### Extension Method\n\n```swift\nfunc valuePublisher() -\u003e AnyPublisher\u003cFloat, Never\u003e\n```\n\n### Code Example\n\n```swift\n// Property Wrapper\n\n@Slider var slider = UISlider()\n\n$slider\n    .sink { value in }\n    .store(in: \u0026cancellables)\n\n// Bindings\n\nJust(true)\n    .bind(to: slider.bindable.isContinuous)\n    .store(in: \u0026cancellables)\n\nJust(1)\n    .bind(to: slider.bindable.minimumValue)\n    .store(in: \u0026cancellables)\n\nJust(100)\n    .bind(to: slider.bindable.maximumValue)\n    .store(in: \u0026cancellables)\n\nJust(.systemPink)\n    .bind(to: slider.bindable.minimumTrackTintColor)\n    .store(in: \u0026cancellables)\n\nJust(.systemPink)\n    .bind(to: slider.bindable.maximumTrackTintColor)\n    .store(in: \u0026cancellables)\n\nJust(.systemPink)\n    .bind(to: slider.bindable.thumbTintColor)\n    .store(in: \u0026cancellables)\n\nJust(1)\n    .bind(to: slider.bindable.value)\n    .store(in: \u0026cancellables)\n\nJust(1)\n    .bind(to: slider.bindable.value(animated: true))\n    .store(in: \u0026cancellables)\n\n// Extension Method\n\nslider\n    .valuePublisher()\n    .sink { value in }\n    .store(in: \u0026cancellables)\n```\n\n## `UIStepper`\n\n| Property | Event |\n| :-- | :-- |\n| `.value` | `.valueChanged` \u003ctr\u003e\u003c/tr\u003e |\n\n### Property Wrapper\n\n```swift\n@Stepper // Projected Value: AnyPublisher\u003cDouble, Never\u003e\n```\n\n### Bindings\n\n```swift\nvar isContinuous: Binding\u003cBool\u003e\nvar autorepeat: Binding\u003cBool\u003e\nvar wraps: Binding\u003cBool\u003e\nvar minimumValue: Binding\u003cDouble\u003e\nvar maximumValue: Binding\u003cDouble\u003e\nvar stepValue: Binding\u003cDouble\u003e\nvar value: Binding\u003cDouble\u003e\n```\n\n### Extension Method\n\n```swift\nfunc valuePublisher() -\u003e AnyPublisher\u003cDouble, Never\u003e\n```\n\n### Code Example\n\n```swift\n// Property Wrapper\n\n@Stepper var stepper = UIStepper()\n\n$stepper\n    .sink { value in }\n    .store(in: \u0026cancellables)\n\n// Bindings\n\nJust(true)\n    .bind(to: stepper.bindable.isContinuous)\n    .store(in: \u0026cancellables)\n\nJust(true)\n    .bind(to: stepper.bindable.autorepeat)\n    .store(in: \u0026cancellables)\n\nJust(true)\n    .bind(to: stepper.bindable.wraps)\n    .store(in: \u0026cancellables)\n\nJust(1)\n    .bind(to: stepper.bindable.minimumValue)\n    .store(in: \u0026cancellables)\n\nJust(100)\n    .bind(to: stepper.bindable.maximumValue)\n    .store(in: \u0026cancellables)\n\nJust(10)\n    .bind(to: stepper.bindable.stepValue)\n    .store(in: \u0026cancellables)\n\nJust(100)\n    .bind(to: stepper.bindable.value)\n    .store(in: \u0026cancellables)\n\n// Extension Method\n\nstepper\n    .valuePublisher()\n    .sink { value in }\n    .store(in: \u0026cancellables)\n```\n\n## `UISwitch`\n\n| Property | Event |\n| :-- | :-- |\n| `.isOn` | `.valueChanged` \u003ctr\u003e\u003c/tr\u003e |\n\n### Property Wrapper\n\n```swift\n@Switch // Projected Value: AnyPublisher\u003cBool, Never\u003e\n```\n\n### Bindings\n\n```swift\nvar onTintColor: Binding\u003cUIColor\u003e\nvar thumbTintColor: Binding\u003cUIColor\u003e\nvar isOn: Binding\u003cBool\u003e\n\nfunc isOn(animated: Bool) -\u003e Binding\u003cBool\u003e\n```\n\n### Extension Method\n\n```swift\nfunc isOnPublisher() -\u003e AnyPublisher\u003cBool, Never\u003e\n```\n\n### Code Example\n\n```swift\n// Property Wrapper\n\n@Switch var `switch` = UISwitch()\n\n$switch\n    .sink { isOn in }\n    .store(in: \u0026cancellables)\n\n// Bindings\n\nJust(.systemPink)\n    .bind(to: `switch`.bindable.onTintColor)\n    .store(in: \u0026cancellables)\n\nJust(.systemPink)\n    .bind(to: `switch`.bindable.thumbTintColor)\n    .store(in: \u0026cancellables)\n\nJust(true)\n    .bind(to: `switch`.bindable.isOn)\n    .store(in: \u0026cancellables)\n\nJust(true)\n    .bind(to: `switch`.bindable.isOn(animated: true))\n    .store(in: \u0026cancellables)\n\n// Extension Method\n\n`switch`\n    .isOnPublisher()\n    .sink { isOn in }\n    .store(in: \u0026cancellables)\n```\n\n## `UITextField`\n\n| Property | Events |\n| :-- | :-- |\n| `.text` | `.allEditingEvents` \u003ctr\u003e\u003c/tr\u003e |\n| `.attributedText` | `.allEditingEvents` \u003ctr\u003e\u003c/tr\u003e |\n\n| Protocol |\n| :-- |\n| `UITextFieldDelegate` \u003ctr\u003e\u003c/tr\u003e |\n\n### Property Wrapper\n\n```swift\n@TextField // Projected Value: TextFieldInterface\n```\n\n`TextFieldInterface`\n\n```swift\n// Properties\n\nvar text: AnyPublisher\u003cString, Never\u003e\nvar attributedText: AnyPublisher\u003cAttributedString, Never\u003e\n\n// UITextFieldDelegate\n\nvar didBeginEditing: AnyPublisher\u003cVoid, Never\u003e\nvar didEndEditing: AnyPublisher\u003cVoid, Never\u003e\nvar didChangeSelection: AnyPublisher\u003cVoid, Never\u003e\n```\n\n### Bindings\n\n```swift\nvar font: Binding\u003cUIFont\u003e\nvar textColor: Binding\u003cUIColor\u003e\nvar textAlignment: Binding\u003cNSTextAlignment\u003e\nvar placeholder: Binding\u003cString\u003e\nvar attributedPlaceholder: Binding\u003cAttributedString\u003e\nvar text: Binding\u003cString\u003e\nvar attributedText: Binding\u003cAttributedString\u003e\n```\n\n### Extension Methods\n\n```swift\nfunc textPublisher() -\u003e AnyPublisher\u003cString, Never\u003e\nfunc attributedTextPublisher() -\u003e AnyPublisher\u003cAttributedString, Never\u003e\n```\n\n### Code Example\n\n```swift\n// Property Wrapper\n\n@TextField var textField = UITextField()\n\n$textField\n    .text\n    .sink { text in }\n    .store(in: \u0026cancellables)\n\n$textField\n    .attributedText\n    .sink { attributedText in }\n    .store(in: \u0026cancellables)\n\n// Bindings\n\nJust(.preferredFont(forTextStyle: .body))\n    .bind(to: textField.bindable.font)\n    .store(in: \u0026cancellables)\n\nJust(.systemPink)\n    .bind(to: textField.bindable.textColor)\n    .store(in: \u0026cancellables)\n\nJust(.natural)\n    .bind(to: textField.bindable.textAlignment)\n    .store(in: \u0026cancellables)\n\nJust(\"Placeholder\")\n    .bind(to: textField.bindable.placeholder)\n    .store(in: \u0026cancellables)\n\nJust(AttributedString(\"Placeholder\"))\n    .bind(to: textField.bindable.attributedPlaceholder)\n    .store(in: \u0026cancellables)\n\nJust(\"Text\")\n    .bind(to: textField.bindable.text)\n    .store(in: \u0026cancellables)\n\nJust(AttributedString(\"Text\"))\n    .bind(to: textField.bindable.attributedText)\n    .store(in: \u0026cancellables)\n\n// Extension Methods\n\ntextField\n    .textPublisher()\n    .sink { text in }\n    .store(in: \u0026cancellables)\n\ntextField\n    .attributedTextPublisher()\n    .sink { attributedText in }\n    .store(in: \u0026cancellables)\n```\n\n## `UITextView`\n\n| Protocol |\n| :-- |\n| `UITextViewDelegate` \u003ctr\u003e\u003c/tr\u003e |\n\n### Property Wrapper\n\n```swift\n@TextView // Projected Value: TextViewInterface\n```\n\n`TextViewInterface`\n\n```swift\n// Properties\n\nvar text: AnyPublisher\u003cString, Never\u003e\nvar attributedText: AnyPublisher\u003cAttributedString, Never\u003e\n\n// UITextViewDelegate\n\nvar didChange: AnyPublisher\u003cVoid, Never\u003e\nvar didBeginEditing: AnyPublisher\u003cVoid, Never\u003e\nvar didEndEditing: AnyPublisher\u003cVoid, Never\u003e\nvar didChangeSelection: AnyPublisher\u003cVoid, Never\u003e\n```\n\n### Bindings\n\n```swift\nvar isEditable: Binding\u003cBool\u003e\nvar font: Binding\u003cUIFont\u003e\nvar textColor: Binding\u003cUIColor\u003e\nvar textAlignment: Binding\u003cNSTextAlignment\u003e\nvar text: Binding\u003cString\u003e\nvar attributedText: Binding\u003cAttributedString\u003e\n```\n\n### Code Example\n\n```swift\n// Property Wrapper\n\n@TextView var textView = UITextView()\n\n$textView\n    .text\n    .sink { text in }\n    .store(in: \u0026cancellables)\n\n$textView\n    .attributedText\n    .sink { attributedText in }\n    .store(in: \u0026cancellables)\n\n// Bindings\n\nJust(true)\n    .bind(to: textView.bindable.isEditable)\n    .store(in: \u0026cancellables)\n\nJust(.preferredFont(forTextStyle: .body))\n    .bind(to: textView.bindable.font)\n    .store(in: \u0026cancellables)\n\nJust(.systemPink)\n    .bind(to: textView.bindable.textColor)\n    .store(in: \u0026cancellables)\n\nJust(.natural)\n    .bind(to: textView.bindable.textAlignment)\n    .store(in: \u0026cancellables)\n\nJust(\"Text\")\n    .bind(to: textView.bindable.text)\n    .store(in: \u0026cancellables)\n\nJust(AttributedString(\"Text\"))\n    .bind(to: textView.bindable.attributedText)\n    .store(in: \u0026cancellables)\n```\n\n## `UIView`\n\n### Bindings\n\n```swift\nvar isUserInteractionEnabled: Binding\u003cBool\u003e\nvar isMultipleTouchEnabled: Binding\u003cBool\u003e\nvar isExclusiveTouch: Binding\u003cBool\u003e\nvar clipsToBounds: Binding\u003cBool\u003e\nvar tintColor: Binding\u003cUIColor\u003e\nvar backgroundColor: Binding\u003cUIColor\u003e\nvar borderColor: Binding\u003cUIColor\u003e\nvar shadowColor: Binding\u003cUIColor\u003e\nvar alpha: Binding\u003cCGFloat\u003e\nvar isOpaque: Binding\u003cBool\u003e\nvar isHidden: Binding\u003cBool\u003e\n```\n\n### Supported Types\n\nJust as every CombineUI binding may be used with subclasses of its supported type, the `UIView` bindings are compatible with all `UIView` subclasses.\n\n### Code Example\n\n```swift\nlet view = UIView()\n\nJust(true)\n    .bind(to: view.bindable.isUserInteractionEnabled)\n    .store(in: \u0026cancellables)\n\nJust(true)\n    .bind(to: view.bindable.isMultipleTouchEnabled)\n    .store(in: \u0026cancellables)\n\nJust(true)\n    .bind(to: view.bindable.isExclusiveTouch)\n    .store(in: \u0026cancellables)\n\nJust(true)\n    .bind(to: view.bindable.clipsToBounds)\n    .store(in: \u0026cancellables)\n\nJust(.systemPink)\n    .bind(to: view.bindable.tintColor)\n    .store(in: \u0026cancellables)\n\nJust(.systemPink)\n    .bind(to: view.bindable.backgroundColor)\n    .store(in: \u0026cancellables)\n\nJust(.systemPink)\n    .bind(to: view.bindable.borderColor)\n    .store(in: \u0026cancellables)\n\nJust(.systemPink)\n    .bind(to: view.bindable.shadowColor)\n    .store(in: \u0026cancellables)\n\nJust(0.5)\n    .bind(to: view.bindable.alpha)\n    .store(in: \u0026cancellables)\n\nJust(true)\n    .bind(to: view.bindable.isOpaque)\n    .store(in: \u0026cancellables)\n\nJust(true)\n    .bind(to: view.bindable.isHidden)\n    .store(in: \u0026cancellables)\n```\n\n## `UIViewController`\n\n### Property Wrapper\n\n```swift\n@ViewController // Projected Value: ViewControllerInterface\n```\n\n`ViewControllerInterface`\n\n```swift\nvar isVisible: AnyPublisher\u003cBool, Never\u003e\nvar viewWillAppear: AnyPublisher\u003cVoid, Never\u003e\nvar viewDidAppear: AnyPublisher\u003cVoid, Never\u003e\nvar viewWillDisappear: AnyPublisher\u003cVoid, Never\u003e\nvar viewDidDisappear: AnyPublisher\u003cVoid, Never\u003e\n```\n\n### Extension Method\n\n```swift\nfunc lifecyclePublisher() -\u003e AnyPublisher\u003cViewControllerLifecycleEvent, Never\u003e\n```\n\n### Publisher Extension\n\n```swift\nfunc isVisiblePublisher() -\u003e AnyPublisher\u003cBool, Failure\u003e where Output == ViewControllerLifecycleEvent\n```\n\n### Code Example\n\n```swift\n// Property Wrapper\n\n@ViewController var viewController = UIViewController()\n\n$viewController\n    .isVisible\n    .sink { isVisible in }\n    .store(in: \u0026cancellables)\n\n$viewController\n    .viewWillAppear\n    .sink { print(\"Appearing\") }\n    .store(in: \u0026cancellables)\n\n$viewController\n    .viewDidAppear\n    .sink { print(\"Appeared\") }\n    .store(in: \u0026cancellables)\n\n$viewController\n    .viewWillDisappear\n    .sink { print(\"Disappearing\") }\n    .store(in: \u0026cancellables)\n\n$viewController\n    .viewDidDisappear\n    .sink { print(\"Disappeared\") }\n    .store(in: \u0026cancellables)\n\n// Extension Methods\n\nlet lifecycle = viewController\n    .lifecyclePublisher()\n    .share()\n\nlifecycle\n    .sink { event in }\n    .store(in: \u0026cancellables)\n\nlifecycle\n    .isVisiblePublisher()\n    .sink { isVisible in }\n    .store(in: \u0026cancellables)\n```\n\n### Notes\n\n- Every subscription adds a helper view (of zero size) to the view hierarchy using view controller containment, therefore consider [sharing the subscription](https://developer.apple.com/documentation/combine/publisher/share()) when there are multiple subscribers (as demonstrated in the example above).\n\n- In stark contrast to the other property wrappers, the `@ViewController` property wrapper is considered to be less useful than the extension methods. This is because the extension methods may be used within a view controller instance to subscribe to its own lifecycle events, for example:\n\n```swift\noverride func viewDidLoad() {\n    super.viewDidLoad()\n    lifecyclePublisher()\n        .isVisiblePublisher()\n        .sink { isVisible in }\n        .store(in: \u0026cancellables)\n}\n```\n\n## Caveats\n\n### Delegation\n\nCombineUI provides publishers for common delegate protocol methods, however due to the nature of publishers, delegate methods that have return values are not available as publishers. Furthermore, the delegate method publishers provided by CombineUI are available as a convenience only. For complex setups, or even when more than just a few delegate methods are required, it is recommended to use an actual delegate class instance.\n\nNote too that setting a delegate property will disable the delegate publisher(s). This means it is not possible to use an actual delegate class instance along with the delegate publishers. Therefore select one pattern or the other for each specific use case.\n\n## Customization\n\n### Adding Bindings to Views and Controls\n\nAdditional bindings are easily added to existing views and controls. This is useful for properties that CombineUI does not yet support natively.\n\nExample:\n\n```swift\nextension Bindable where Target: UIView {\n\n    var tag: Binding\u003cInt\u003e {\n        Binding(self, for: \\.tag)\n    }\n}\n```\n\n### Adopting CombineUI in Custom Views and Controls\n\nThe same type of APIs that CombineUI provides can also be adopted by custom views and controls.\n\nExample:\n\n```swift\n@propertyWrapper\nstruct Example\u003cT: ExampleControl\u003e {\n\n    var wrappedValue: T\n    var projectedValue: AnyPublisher\u003cExampleValue, Never\u003e\n\n    init(wrappedValue: T) {\n        self.wrappedValue = wrappedValue\n        self.projectedValue = wrappedValue\n            .valuePublisher()\n            .share()\n            .eraseToAnyPublisher()\n    }\n}\n\nextension Bindable where Target: ExampleControl {\n\n    var value: Binding\u003cExampleValue\u003e {\n        Binding(self, for: \\.value)\n    }\n}\n\nextension ExampleControl {\n\n    func valuePublisher() -\u003e AnyPublisher\u003cExampleValue, Never\u003e {\n        publisher(for: .valueChanged)\n            .compactMap { [weak self] _ in self?.value }\n            .prepend(value)\n            .eraseToAnyPublisher()\n    }\n}\n```\n\nThe CombineUI source code may be used as reference for additional examples.\n\n## Contributing\n\nWhile interest in contributing to this project is appreciated, it has been open \nsourced solely for the purpose of sharing with the community. This means we are \nunable to accept outside contributions at this time and pull requests will not \nbe reviewed or merged. To report a security concern or vulnerability, please \nsubmit a GitHub issue.\n\n## License\n\nLicensed under the [Match Group Modified 3-Clause BSD License](\nhttps://github.com/Tinder/CombineUI/blob/main/LICENSE\n).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftinder%2Fcombineui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftinder%2Fcombineui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftinder%2Fcombineui/lists"}