当前位置: 首页 > 知识库问答 >
问题:

使用Combine和Swiftui重置TextField值

许法
2023-03-14

当满足某个条件时,我尝试重置一个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)
    }
}

共有2个答案

宋涵衍
2023-03-14

这是一个你不需要任何组合的情况。只需使用普通的didset来观察属性的更改:

class ViewModel: ObservableObject {
    @Published var code = "" {
        didSet {
            if code.count == 4 {
                self.code = ""
            }
        }
    }
}
穆文斌
2023-03-14

添加.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示例吗?请分享吧! 更新 您最好在样式中使用一些参数并将其绑定到“父”视图 结果看起来像