簡體   English   中英

iOS 組合框架 - 發布者僅發布一次,然后不再發布

[英]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 的例子,我不知道我在這里遺漏了什么。

一個常見的錯誤是認為UISwitchisOn屬性是 KVO 兼容的。 可悲的是,事實並非如此。 您不能使用publisher(for:)來觀察它。

在您的ViewController創建一個@IBAction ,並將開關的 Value Changed 事件連接到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM