Swift 结合问题与 UILabel 订阅
Swift Combine question with UILabel subscribe
import UIKit
import Combine
class ViewController: UIViewController {
@IBOutlet weak var allowMessageSwitch: UISwitch!
@IBOutlet weak var sendButton: UIButton!
@IBOutlet weak var messageLabel: UILabel!
@Published var canSendMessages: Bool = false
@Published var newMsg: String = ""
private var switchSubscriber: AnyCancellable?
private var btnSubscriber: AnyCancellable?
override func viewDidLoad() {
allowMessageSwitch.isOn = false
super.viewDidLoad()
setupProcesscingChain()
}
func setupProcesscingChain() {
switchSubscriber = $canSendMessages.receive(on: DispatchQueue.main).assign(to: \.isEnabled, on: sendButton)
btnSubscriber = $newMsg.receive(on: DispatchQueue.main).assign(to: \.text, on: messageLabel)
}
@IBAction func didSwitch (_ sender: UISwitch) {
canSendMessages = sender.isOn
}
@IBAction func sendMessage( _ sender: Any) {
}
}
我在
中遇到错误
btnSubscriber = $newMsg.receive(on: DispatchQueue.main).assign(to: \.text, on: messageLabel)
错误消息是
Type of expression is ambiguous without more context
我不明白为什么标签不能用作切换器 (bool)
我猜是因为 \.isEnabled
不是可选的,而 \.text
是可选的..??
我怎样才能使它以相同的格式工作。这是为了练习和了解 Combine 的工作原理。请帮忙!
lableSubscriber = $newMsg.receive(on: DispatchQueue.main).assign(to: \.text!, on: messageLabel)
我自己解决了!这很简单。
只需强制打开 keyPath。
import UIKit
import Combine
class ViewController: UIViewController {
@IBOutlet weak var allowMessageSwitch: UISwitch!
@IBOutlet weak var sendButton: UIButton!
@IBOutlet weak var messageLabel: UILabel!
@Published var canSendMessages: Bool = false
@Published var newMsg: String = ""
private var switchSubscriber: AnyCancellable?
private var btnSubscriber: AnyCancellable?
override func viewDidLoad() {
allowMessageSwitch.isOn = false
super.viewDidLoad()
setupProcesscingChain()
}
func setupProcesscingChain() {
switchSubscriber = $canSendMessages.receive(on: DispatchQueue.main).assign(to: \.isEnabled, on: sendButton)
btnSubscriber = $newMsg.receive(on: DispatchQueue.main).assign(to: \.text, on: messageLabel)
}
@IBAction func didSwitch (_ sender: UISwitch) {
canSendMessages = sender.isOn
}
@IBAction func sendMessage( _ sender: Any) {
}
}
我在
中遇到错误btnSubscriber = $newMsg.receive(on: DispatchQueue.main).assign(to: \.text, on: messageLabel)
错误消息是
Type of expression is ambiguous without more context
我不明白为什么标签不能用作切换器 (bool)
我猜是因为 \.isEnabled
不是可选的,而 \.text
是可选的..??
我怎样才能使它以相同的格式工作。这是为了练习和了解 Combine 的工作原理。请帮忙!
lableSubscriber = $newMsg.receive(on: DispatchQueue.main).assign(to: \.text!, on: messageLabel)
我自己解决了!这很简单。 只需强制打开 keyPath。