我试图通过使用正则表达式删除某些字符来验证 TextField 中的用户输入。不幸的是,我遇到了text递归调用自身 var的 didSet 方法的问题。
import SwiftUI
import Combine
class TextValidator: ObservableObject {
@Published var text = "" {
didSet {
print("didSet")
text = text.replacingOccurrences(
of: "\\W", with: "", options: .regularExpression
) // `\W` is an escape sequence that matches non-word characters.
}
}
}
struct ContentView: View {
@ObservedObject var textValidator = TextValidator()
var body: some View {
TextField("Type Here", text: $textValidator.text)
.padding(.horizontal, 20.0)
.textFieldStyle(RoundedBorderTextFieldStyle())
}
}
Run Code Online (Sandbox Code Playgroud)
在swift 文档(请参阅 AudioChannel 结构)中,Apple 提供了一个示例,其中在其自己的 didSet 方法中重新分配了一个属性,并明确指出这不会导致再次调用 …
我在 SwiftUI 中遇到了这个非常奇怪的问题/错误。在该setupSubscription方法中,我创建一个订阅subject并将其插入到cancellables集合中。然而,当我打印 的计数时cancellables,我得到零。如果我刚刚插入一个元素,集合怎么会是空的呢?这可能就是handleValue当我点击按钮时不调用该方法的原因。这是控制台的完整输出:
init
begin setupSubscription
setupSubscription subject sink: receive subscription: (CurrentValueSubject)
setupSubscription subject sink: request unlimited
setupSubscription subject sink: receive value: (initial value)
handleValue: 'initial value'
setupSubscription: cancellables.count: 0
setupSubscription subject sink: receive cancel
sent value: 'value 38'
cancellables.count: 0
sent value: 'value 73'
cancellables.count: 0
sent value: 'value 30'
cancellables.count: 0
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?为什么我的订阅被subject取消了?为什么handleValue我点击按钮后没有接到电话?
import SwiftUI
import Combine
struct Test: View {
@State private var …Run Code Online (Sandbox Code Playgroud)