[英]iOS Combine Framework - Publisher Only Publishes Once and Then Never Again
我正在嘗試將 iOS 13 Combine 框架與一些 UIKit 控件結合使用。 我想設置一個包含一個開關的視圖控制器,該開關在開關打開/關閉時啟用/禁用按鈕。 根據 Apple 的文檔,UIKit 控件內置了對 Combine 發布者等的支持,所以這應該是可能的。
我有一個包含 UISwitch 和 UIButton 的視圖控制器,如下所示:
這是我的代碼:
import Combine
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var mySwitch: UISwitch!
@IBOutlet weak var myButton: UIButton!
var myCancellable: AnyCancellable?
override func viewDidLoad() {
super.viewDidLoad()
mySwitch.isOn = true // Set initial state of switch
myButton.setTitle("Enabled", for: .normal)
myButton.setTitle("Disabled", for: .disabled)
myCancellable = mySwitch.publisher(for: \.isOn)
.subscribe(on: RunLoop.main)
.assign(to: \.isEnabled, on: myButton)
}
}
上面的代碼應該(或者我認為)發出開關的.isOn
屬性的值,每當該屬性更改時,並將該值分配給按鈕的.isEnabled
屬性。 如果它以我期望的方式運行,這意味着當開關切換為 ON 時,按鈕標題應顯示為“已啟用”,並且應啟用該按鈕。 當 UISwitch 切換為 OFF 時,按鈕標題應顯示為“已禁用”並且按鈕應被禁用。
但它的行為並不像我期望的那樣。 當第一次在viewDidLoad()
設置發布者時,來自 switch 發布者的值只發出一次。 當點擊開關打開或關閉它時,它永遠不會再發出一個值。 我可以告訴它至少發出一次值,因為如果我將開關的初始狀態更改為打開或關閉,則在加載視圖控制器時按鈕將設置為預期狀態。
通常,您應該保留對發布者的強引用,否則發布者/訂閱者將立即終止,這就是為什么我使用myCancellable
變量持有引用的myCancellable
。 但這並不能解決問題,點擊開關時仍然沒有發出值。
有沒有人對如何解決這個問題有任何想法? 這似乎應該是一個簡單的“Hello World”類型的使用 Combine 的例子,我不知道我在這里遺漏了什么。
一個常見的錯誤是認為UISwitch
的isOn
屬性是 KVO 兼容的。 可悲的是,事實並非如此。 您不能使用publisher(for:)
來觀察它。
在您的ViewController
創建一個@IBAction
,並將開關的 Value Changed 事件連接到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.