繁体   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