首页 > 解决方案 > swiftui中的自动完成搜索不起作用

问题描述

我有一个 TextField 作为搜索框。我想让它自动搜索,即每当我在 TextField 中输入一个字母时,我应该不按回车就得到结果。这是我的代码:

TextField("Search", text: $searchText, 
    onEditingChanged: {
        isEditing in
        print("isEditing")
        //my method to fetch result
    }, onCommit: {
        print("onCommit")
    })

但它不是那样工作的。在文本字段中输入一个字母后,当我按下回车键时,它首先打印“onCommit”,然后打印“isEditing”。知道如何让它工作吗?

标签: swiftuiswiftui-listswiftui-environmentswiftui-formswiftui-texteditor

解决方案


在您的情况下,我想使用组合框架的Just订阅者。请检查该.onReceive部分以了解。这是经过测试的代码。Just是一个发布者,它只向每个订阅者发出一次输出,然后完成。

因此,当它检测到更改时,它会发布并.onReceiver捕获该更改。

import SwiftUI
import Combine

struct TestView: View {
    @State var searchText: String = ""
    
    var body: some View {
        VStack {
            TextField("Search", text: $searchText,
                onEditingChanged: {
                    isEditing in
                    print("isEditing")
                    //my method to fetch result
                }, onCommit: {
                    print("onCommit")
                })
                .onReceive(Just(searchText), perform: { _ in
                    if searchText.count > 0 {
                        print("Text entered: \(searchText). Now do whatever you want")
                    }
                })
        }
    }
}

推荐阅读