gpt4 book ai didi

iOS Combine Framework - Publisher 只发布一次,然后再也不会发布

转载 作者:行者123 更新时间:2023-12-01 21:58:35 25 4
gpt4 key购买 nike

我正在尝试将 iOS 13 Combine 框架与一些 UIKit 控件结合使用。我想设置一个 View Controller ,其中包含一个开关,只要开关打开/关闭,它就会启用/禁用按钮。根据 Apple 的文档,UIKit 控件内置了对 Combine publishers 等的支持,所以这应该是可能的。

我有一个包含 UISwitch 和 UIButton 的 View Controller ,如下所示:

link to screenshot of my viewcontroller

这是我的代码:

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 属性(property)。如果它按我期望的方式运行,则意味着当开关切换到 ON 时,按钮标题应显示为“已启用”,并且应启用该按钮。当 UISwitch 切换为 OFF 时,按钮标题应显示为“Disabled”并且按钮应被禁用。

但它的行为并不像我期望的那样。当首次在 viewDidLoad() 中设置发布者时,开关发布者的值只会发出一次。当点击开关以打开或关闭它时,它永远不会再发出一个值。我可以说它至少发出一次值,因为如果我将开关的初始状态更改为打开或关闭,则在加载 View Controller 时按钮将设置为预期状态。

通常您应该保持对发布者的强引用,否则发布者/订阅者将立即终止,所以这就是为什么我使用 myCancellable 变量持有引用。但这并不能解决问题,点击开关时仍然不会发出值。

有人知道如何解决这个问题吗?这看起来应该是一个使用 Combine 的简单“Hello World”类型的示例,我不知道我在这里遗漏了什么。

最佳答案

一个常见的错误是认为 UISwitchisOn 属性是 KVO 兼容的。 Sadly, it isn't.您不能使用 publisher(for:) 来观察它。

在您的 ViewController 中创建一个 @IBAction,并将开关的 Value Changed 事件连接到它。

关于iOS Combine Framework - Publisher 只发布一次,然后再也不会发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60780725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com