ios - SwiftUI - @Published 属性未从协调器更新视图
问题描述
我正在使用包装器,UISearchBar
并且在将@Published
属性传递到此SearchBar
包装器与TextField
.
两者都按预期更新@ObservedObject var query = Query()
类属性,但只有更新视图。我希望在更改时更新视图,类似于从.@Published var input
TextField
SearchSheet
input
SearchBar
TextField
编辑:我已经更新了我的问题,以包括ContentView
看起来这个问题特定于从 aButton
中调用工作表时的问题NavigationBarItem
。
struct ContentView: View {
@State var showingSearch = false
var body: some View {
NavigationView {
VStack {
Text("Hello World")
}
.navigationBarItems(trailing:
Button(action: {
self.showingSearch.toggle()
}) {
Image(systemName: "magnifyingglass")
}
.sheet(isPresented: $showingSearch) {
SearchSheet(isPresented: self.$showingSearch)
}
)
}
}
}
class Query: ObservableObject {
@Published var input = "" {
didSet {
// Called as expected in both cases but only TextField updates the SearchSheet view.
}
}
}
struct SearchSheet: View {
@ObservedObject var query = Query()
var body: some View {
VStack {
// Does not update the SearchSheet view. I would like it understand why and how to update it.
SearchBar(text: $query.input, placeholder: "Search")
// Does update the SearchSheet view.
TextField("Search", text: $query.input)
Text("\(query.input)")
}
}
}
import SwiftUI
struct SearchBar: UIViewRepresentable {
@Binding var text: String
var placeholder: String
class Coordinator: NSObject, UISearchBarDelegate {
@Binding var text: String
init(text: Binding<String>) {
_text = text
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
text = searchText
}
}
func makeCoordinator() -> SearchBar.Coordinator {
return Coordinator(text: $text)
}
func makeUIView(context: UIViewRepresentableContext<SearchBar>) -> UISearchBar {
let searchBar = UISearchBar(frame: .zero)
searchBar.delegate = context.coordinator
searchBar.placeholder = placeholder
searchBar.searchBarStyle = .minimal
searchBar.autocapitalizationType = .none
return searchBar
}
func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext<SearchBar>) {
uiView.text = text
}
}
struct SearchBar_Previews: PreviewProvider {
@State private static var text = ""
static var previews: some View {
SearchBar(text: $text, placeholder: "Search")
}
}
解决方案
将工作表的显示移出navigationBarItems
解决了该问题。当时我认为这是一个错误。
.navigationBarItems(trailing:
Button(action: {
self.showingSearch.toggle()
}) {
Image(systemName: "magnifyingglass")
}
)
.sheet(isPresented: $showingSearch) {
SearchSheet(isPresented: self.$showingSearch)
}
推荐阅读
- c# - 如何通过在 VS 2017 中按日期访问 TFS Warehouse 来获取任务 ID、功能 ID、完成小时数?
- ruby - 合并哈希数组中的重复值
- ruby - 如何查找 Google sheet API v4 的令牌
- postgresql - 可以为具有更多死元组的表的实时数据库运行真空完整详细命令吗?
- javascript - 根据 Knockout.js 中选择列表的选定选项显示或隐藏 HTML 元素?
- selenium - 直到在 Selenium 3 中被弃用
- python - 列表中字符串中间的正则表达式(Python)
- c# - 抛出异常的性能注意事项(重构此模式的最佳方法)
- php - 如何处理具有多种角色类型的同一用户
- python - Python:参考、字典和列表