简单 Swift 结合订阅 textDidChangeNotification
Simple Swift Combine subscribing to textDidChangeNotification
我在订阅 UITextField textDidChangeNotification 时无法使用最简单的 Combine 模式实现。
import UIKit
import Combine
class ViewController: UIViewController {
let textField = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(textField)
textField.frame = CGRect(x: 100, y: 0, width: view.frame.width, height: 100)
textField.placeholder = "Search"
let sub = NotificationCenter.default.publisher(for: UITextField.textDidChangeNotification, object: textField)
.sink { (notification) in
print("123")
}
}
}
我一定是遗漏了一些非常简单的东西,但这个基本模式完全是从文档和其他教程中复制的。
感谢您的帮助。
sink
调用 returns 一个 AnyCancellable
,一个模拟订阅生命周期的 ARC 管理对象。
您已将此可取消标记分配给局部变量 sub
,其生命周期在最后一次使用 sub
变量时结束(不晚于 viewDidLoad()
函数作用域结束) .这导致您的订阅在任何事情发生之前就被提前取消。
如果您希望您的订阅持续更长时间,您需要延长 sub
的生命周期,或许可以将其存储为 ViewController
对象的 属性。
我在订阅 UITextField textDidChangeNotification 时无法使用最简单的 Combine 模式实现。
import UIKit
import Combine
class ViewController: UIViewController {
let textField = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(textField)
textField.frame = CGRect(x: 100, y: 0, width: view.frame.width, height: 100)
textField.placeholder = "Search"
let sub = NotificationCenter.default.publisher(for: UITextField.textDidChangeNotification, object: textField)
.sink { (notification) in
print("123")
}
}
}
我一定是遗漏了一些非常简单的东西,但这个基本模式完全是从文档和其他教程中复制的。
感谢您的帮助。
sink
调用 returns 一个 AnyCancellable
,一个模拟订阅生命周期的 ARC 管理对象。
您已将此可取消标记分配给局部变量 sub
,其生命周期在最后一次使用 sub
变量时结束(不晚于 viewDidLoad()
函数作用域结束) .这导致您的订阅在任何事情发生之前就被提前取消。
如果您希望您的订阅持续更长时间,您需要延长 sub
的生命周期,或许可以将其存储为 ViewController
对象的 属性。