如何使用搜索栏从 SwiftUI 视图调用完成块?

大卫·邓恩

我想在此视图中创建一个搜索栏,但我想知道如何调用填充数据的完成块。目前我有完成块,.onAppear但是当我添加搜索栏时,数据只会加载一次.onAppear,因此当我搜索时,结果不会更新。这是我的观点

struct CocktailList: View {
    @State private var cocktails: [Cocktail]
    @State private var searchText = ""
    var body: some View {
        VStack {
            NavigationView {
                List(cocktails, id: \.idDrink) { cocktail in
                    NavigationLink(destination: CocktailDetail(fromCocktail: cocktail)) {
                        CocktailRow(fromCocktail: cocktail)
                    }
                }
                .navigationTitle("Search Results")
            }.onAppear {
                requestCocktail(searchTerm: "daiquiri") { cocktails in
                    self.cocktails = cocktails
                }
            }
        }
    }
    
    init() {
        self.cocktails = []
    }
}

如何调用requestCocktail()searchText 的更新以及集成简单搜索栏的最佳方法是什么?

阿德里安

我举了一个带有 TextField 和不同相关操作的示例:onCommit, onEditing,当文本更改时,当文本 1 秒未更改时。您可以选择何时执行requestCocktail()

import Combine
import SwiftUI
struct SwiftUIView11: View {
    @State private var text: String = ""
    @State private var result: String = ""
    let textHasChanged = PassthroughSubject<Void, Never>()
    let debouncer: AnyPublisher<Void, Never>

    init() {
        debouncer = textHasChanged
            .debounce(for: .seconds(1), scheduler: DispatchQueue.main)
            .eraseToAnyPublisher()
    }

    var body: some View {
        VStack {
            Text(result)

            TextField("", text: $text, onEditingChanged: {
                isEditing in
                result = isEditing ? "isEditing" : "isNotEditing"
            }, onCommit: {
                result = "onCommit"
            })
                .background(Color.yellow)
            .onChange(of: text) { newText in
                result = "text changed : \(newText)"
                textHasChanged.send()
            }
            .onReceive(debouncer) { _ in
                result = "paused editing"
            }
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章