当满足某个条件时,我尝试重置一个textfield
值(.count==4)
,但它不起作用,我遗漏了什么?
class ViewModel: ObservableObject {
@Published var code = ""
private var anyCancellable: AnyCancellable?
init() {
anyCancellable = $code.sink { (newVal) in
if newVal.count == 4 {
self.code = ""
}
}
}
}
struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
TextField("My code", text: $viewModel.code)
}
}
这是一个你不需要任何组合的情况。只需使用普通的didset
来观察属性的更改:
class ViewModel: ObservableObject {
@Published var code = "" {
didSet {
if code.count == 4 {
self.code = ""
}
}
}
}
添加.receive(on:dispatchqueue.main)
似乎可以解决此问题,但是,我不完全确定为什么需要它。
另外,请确保在接收器块中捕获[弱自体],以避免内存泄漏:
anyCancellable = $code
.receive(on: DispatchQueue.main) // <--
.sink { [weak self] newVal in
if newVal.count == 4 {
self?.code = ""
}
SwiftUI 文本字段可以与可选绑定一起使用吗?当前此代码: 产生以下错误: 无法转换“Binding”类型的值 有什么办法解决这个问题吗?在数据模型中使用选项是一种非常常见的模式——事实上,这是核心数据中的默认模式,所以SwiftUI不支持它们似乎很奇怪
问题内容: 可以为设置最大长度吗?我当时正在考虑使用事件来处理它,但仅在用户开始/完成编辑时才调用它,而在用户键入时不调用它。我也阅读了文档,但还没有找到任何东西。有什么解决方法吗? 问题答案: Paulw11的答案稍短一些: 您只需要一个TextField字符串的包装即可。可以将其视为一个解释器,该解释器每次发生更改时都会得到通知,并且能够将修改发送回TextField。但是,无需使用修饰符创建
问题内容: 这是我的代码: 我想要的是当文本字段变为 可见时 ,使文本字段成为第一响应者(即获得焦点并弹出键盘)。 问题答案: 目前似乎还不太可能,但是您可以自己实现类似的功能。 您可以创建一个自定义文本字段并添加一个值,使其成为第一响应者。 注意:需要确保文本字段仅成为第一响应者,而不是每次刷新时都由! 您将像这样使用它… PS我添加了一个,因为它的行为不像股票,这意味着在幕后还有更多的事情要做
我对如何在两个模型之间传递数据有疑问。 所以我想把状态从单元传递到主模型,并在那里进行反应。例如发送请求。
Combine 是一个用Perl语言开发的开放的可扩展的互联网资源爬虫程序。
问题内容: 我这样更改了TextField样式: 现在,我希望它在用户点击时更改样式。 我的CustomTextFieldStyle定义为: 问题答案: 你有自己的TextStyle示例吗?请分享吧! 更新 您最好在样式中使用一些参数并将其绑定到“父”视图 结果看起来像