Ios UITextView发行商没有';当用户轻触键盘时,不要发布信号

Ios UITextView发行商没有';当用户轻触键盘时,不要发布信号,ios,swift,combine,Ios,Swift,Combine,苹果说: Combine还为任何用户提供内置发布服务器 符合键值的属性 因此,我在视图控制器视图中有一个UITextView实例,当用户点击键盘时,它应该会通过publisher发出信号,但不会发生。下面是一段代码,解释了我订阅出版商的方式 class MyViewController : UIViewController { var t = UITextView(frame: .init(x: 0, y: 0, width: 100, height: 20)) overr

苹果说:

Combine还为任何用户提供内置发布服务器 符合键值的属性

因此,我在视图控制器视图中有一个UITextView实例,当用户点击键盘时,它应该会通过publisher发出信号,但不会发生。下面是一段代码,解释了我订阅出版商的方式

class MyViewController : UIViewController {

    var t = UITextView(frame: .init(x: 0, y: 0, width: 100, height: 20))


    override func viewDidLoad() {
    super.viewDidLoad()

        t.publisher(for: \UITextView.text)
            .receive(on: RunLoop.main)
            .sink { (str) in
                print(str)
        }

        view.addSubview(t)
    }
}

您没有存储
订阅
a.k.a.
anycancelable
。只需这样做:

类MyViewController:UIViewController{
var t=UITextView(帧:.init(x:0,y:0,宽度:100,高度:20))
var set=set()
重写func viewDidLoad(){
super.viewDidLoad()
t、 发布者(适用于:\UITextView.text)
.receive(打开:RunLoop.main)
.sink{(str)in
打印(str)
}.store(位于:&集合中)
视图。添加子视图(t)
}
}

除了确保存储您的订阅,使其不会被内存管理删除之外,还要注意这样一个事实,即UIKit的许多部分都不符合KVO,而且当事情在KVO中运行时,它们通常是意外事件的结果

这意味着您可能不想依赖KVO来检索用户输入,除非您准备在许多不同的场景中为每个小iOS版本继续测试结果

相反,对于此类信息,您可能一直依赖
UITextViewDelegate
方法,如
textdichange(UITextView)
,至少目前是这样。如果明年这个时候我们没有任何类型的UIKit组合绑定选项,我会感到震惊