观察SwiftUI TextField上的更改

时间:2019-11-25 20:59:34

标签: ios swift combine swift5.2

我正在玩Swift UI。我创建了一个包含所有所需元素的表视图(一个列表)。当按键盘上的Enter键时,TextField更改也起作用。很高兴建立这么快的表格视图;)。

但是现在我想跟踪文本字段上的所有更改。每次用户输入其他文本时,我要发送触发搜索的请求。

该如何在我的代码中完成?我还在https://developer.apple.com/documentation/combine/receiving_and_handling_events_with_combine

处阅读了此文档

我现在不知道如何在我的结构中使用它。

这里TextField changes in SwiftUI的建议解决方案无法正常工作

对于您可以与我分享的每一个提示和想法,我将深表感谢。我正在寻找解决方案的时间:(。

我的代码如下:

import Foundation
import SwiftUI

struct MyListView: View {
    @ObservedObject var viewModel: MyViewModel

    @State private var query = ""

    var body: some View {

        NavigationView {
            List {
                // how to listen for changes here?
                // if I add onEditingChange here, Get the value only after the user finish search (by pressing enter on the keyboard)
                TextField(String.localizedString(forKey: "search_bar_hint"), text: self.$query) {
                    self.fetchListing()
                } 

                ForEach(viewModel.myArray, id: \.id) { arrayObject in
                    MyRow(arrayObj: arrayObject)
                }
            }
            .navigationBarTitle(navigationBarTitle())
        }
        .onAppear(perform: fetchListing)
    }

    private func fetchListing() {
        query.isEmpty ? viewModel.fetchRequest(for: nil) : viewModel.fetchRequest(for: query)
    }

    private func navigationBarTitle() -> String {
        return query.isEmpty ? String.localizedString(forKey: "my_title") : query
    }
}

2 个答案:

答案 0 :(得分:3)

简单的自定义binding是此任务的良好起点:

struct ContentView: View {
    @State private var query = ""

    var body: some View {

        let binding = Binding<String>(
            get: { self.query },
            set: { self.query = $0; self.textFieldChanged($0) }
        )

        return NavigationView {
            List {
                TextField("Text", text: binding)
            }
        }
    }

    private func textFieldChanged(_ text: String) { print(text) }
}

它已经过测试并且可以正常工作

答案 1 :(得分:1)

我们在这里

struct ContentView: View {
    @State private var email = ""
    var body: some View {
        TextField("Email", text: $email)
            .onChange(of: email) { text in
                print(text)
            }
    }
}