【问题标题】:UITextView publisher doesn't publish a signal when a user taps a keyboard当用户点击键盘时,UITextView 发布者不发布信号
【发布时间】:2019-09-23 14:40:48
【问题描述】:

苹果说:

Combine 还为任何 符合 Key-Value Observing 的属性。

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

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)
    }
}

【问题讨论】:

    标签: ios swift combine


    【解决方案1】:

    您没有存储subscription 又名AnyCancellable。只需这样做:

    class MyViewController : UIViewController {
    
        var t = UITextView(frame: .init(x: 0, y: 0, width: 100, height: 20))
        var set = Set<AnyCancellable>()
    
        override func viewDidLoad() {
        super.viewDidLoad()
    
            t.publisher(for: \UITextView.text)
                .receive(on: RunLoop.main)
                .sink { (str) in
                    print(str)
            }.store(in: &set)
    
            view.addSubview(t)
        }
    }
    

    【讨论】:

      【解决方案2】:

      除了确保您存储订阅以便它不会被内存管理删除之外,请注意许多 UIKit 不符合 KVO 的事实,并且当事情在 KVO 中运行时,它们通常是快乐事故的结果。

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

      相反,您可能无法依靠 UITextViewDelegate 方法(例如 textDidChange(UITextView))来获取此类信息 - 至少目前如此。如果明年这个时候我们没有为 UIKit 提供任何类型的组合绑定选项,我会感到震惊。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-30
        • 2022-06-29
        • 1970-01-01
        • 2021-09-13
        • 1970-01-01
        • 2021-12-29
        • 2012-12-17
        • 1970-01-01
        相关资源
        最近更新 更多