我有一个用于在数组中搜索项的文本字段,并且我正在使用一个模型,该模型具有一个已发布的文本属性,绑定到该字段,以便在每次文本更改时调用搜索函数.

我目前的问题是,每当文本字段发生任何变化时,它都会发送一个已更改的通知,因此当它第一次出现时,它会发送一个通知,每次它被聚焦、散焦或输入一封信时,它都会发送两个通知.

这显示了该字段发送更改的次数:

Animation

以下是代码的简化示例:

struct ContentView: View {
    @ObservedObject var model = Model()
    @FocusState var focused: Bool

    var body: some View {
        VStack {
            TextField("Field", text: $model.text)
                .submitLabel(.search)
                .focused($focused)

            Text("Field has sent changes \(model.textChanged) times")
            Button(action: { focused = false }) {
                Text("Defocus")
            }
        }
        .padding()
    }
}


class Model: ObservableObject {
    @Published var text: String = ""
    @Published var textChanged: Int = 0

    private var cancellables = Set<AnyCancellable>()

    init() {
        $text
            .sink { text in
                self.textChanged += 1 // This is where i am doing my search call in the actual code
            }
            .store(in: &cancellables)
    }
}

我试着在TextField上使用.onReceive,在view上使用.onChange($text),而不是.sink,但这并没有改变任何事情.我知道这是TextField的默认行为,但我只想在文本更改时执行搜索,而不是每次字段发生变化时执行搜索.将搜索电话拨入text号房产的didSet也不是一种 Select .

推荐答案

您可以只将.onChange连接到TextField上(或者您也可以将其连接到body的任何部件上).

你说你以前试过,但你用的是装订.它不应该是一个约束性的:

@State private var counter = 0

var body: some View {
    VStack {
        TextField("Field", text: $model.text)
            .submitLabel(.search)
            .focused($focused)
            // pre iOS 17: .onChange(of: model.text) { newVal in
            .onChange(of: model.text) { oldVal, newVal in
                counter += 1
            }

        Text("Field has sent changes \(model.textChanged) times, counter=\(counter)")
        Button(action: { focused = false }) {
            Text("Defocus")
        }
    }
    .padding()
}

Ios相关问答推荐

如何在wiftUI中管理导航栈?

如何让3张组合的`SF Symbol`图片围绕一个特定点旋转?

当文本为空时,具有垂直轴的SwiftUI文本字段不会与FirstTextBaseline对齐

为什么AVSpeechSynthesizer复制的信息比我的文本多?

如何删除点击时按钮的不透明动画?

Apollo iOS 客户端代码生成:错误:无法查询字段

Flutter IOS 构建错误 - 在签名和功能编辑器中 Select 一个开发团队.

PropertyWrapper 不存在的 Codable 属性的默认值

如何从 Locale Swift 获取货币符号

将角半径仅应用于 Swiftui 中按钮的两个角

如何在Collection 后更改并保留按钮 colored颜色 ,然后在 SwiftUI 中切换回来?

通过MatchedGeometryEffect向上滑动视图

如何快速设置条形按钮的图像?

缺少推送通知权利

在 iOS 编程中使用 Storyboard 代替 xib 文件有什么好处?

核心数据 - 无法在路径加载优化模型

SRCROOT 和 PROJECT_DIR 有什么区别?

测试目标 X 遇到错误(提前意外退出,操作从未完成 bootstrap - 不会try 重新启动

UISegmentedControl 以编程方式更改段数

如何删除 Swift 数组中的所有 nil 元素?