有没有办法以声明性方式获取 UITextField 的文本更新?



我很困惑为什么下面的代码不起作用。


dateTextField.publisher(for: .text)
.sink(receiveCompletion: { completion  in
print("completion", completion)
}, receiveValue: { value in
print("value", value ?? "")
}).store(in: &subscriptions)

我刚收到第一个事件,一个空文本。我的猜测是因为UITextField的文本属性不符合KVO。但是,为什么订阅会收到第一个值?

您现在可以收听NotificationCenter更新

NotificationCenter.default.publisher(for: UITextField.textDidChangeNotification, object: yourTextField).map { ($0.object as! UITextField).text }

目前还不清楚如何以及在哪里(哪个运行时环境(使用它,但它可以工作。使用Xcode 11.2/Swift 5.1/iOS 13.2 进行测试

这是SwiftUI测试UITextField发布者的演示(只是将发布者附加到现有的测试中,它可以工作(。希望它能有所帮助。

import SwiftUI
import Combine
import UIKit
struct TextView: UIViewRepresentable {
@Binding var text: String
private let cancelable: AnyCancellable
private let myTextView: UITextView
init(text: Binding<String>) {
self._text = text
myTextView = UITextView()
myTextView.isScrollEnabled = true
myTextView.isEditable = true
myTextView.isUserInteractionEnabled = true
cancelable = myTextView.publisher(for: .text)
.sink { value in
print("Get: (value ?? "no value")")
}
}
func makeUIView(context: Context) -> UITextView {
self.myTextView.delegate = context.coordinator
return self.myTextView
}
func updateUIView(_ uiView: UITextView, context: Context) {
uiView.text = text
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator : NSObject, UITextViewDelegate {
var parent: TextView
init(_ uiTextView: TextView) {
self.parent = uiTextView
}
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
return true
}
func textViewDidChange(_ textView: UITextView) {
self.parent.text = textView.text
}
}
}
struct TestTextViewNewLine: View {
@State var text = ""
var body: some View {
HStack {
Text("Label:")
TextView(text: $text)
.background(RoundedRectangle(cornerRadius: 4).stroke())
.frame(maxHeight: 32)
}
}
}
struct TestTextViewNewLine_Previews: PreviewProvider {
static var previews: some View {
TestTextViewNewLine()
}
}

输出:

2019-11-21 21:59:10.436516+0200测试[1122:35207][Agent]收到显示消息获取:获取:获取:HGet:他获取:Hel获取:地狱获取:你好

我也遇到过同样的问题,显然有一个明确的原因:我的控制器被释放了。所以我建议检查订阅和拥有它的对象

最新更新