我想在此视图中创建一个搜索栏,但我想知道如何调用填充数据的完成块。目前我有完成块,.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] 删除。
我来说两句