Swiftui 能否将UIViewRepresentable(UISearchBar)添加为navigationBarItem迅捷
我正在像这样设置前导和尾随导航项Swiftui 能否将UIViewRepresentable(UISearchBar)添加为navigationBarItem迅捷,swiftui,Swiftui,我正在像这样设置前导和尾随导航项 .navigationBarItems(leading: SearchBar(text: $searchText), trailing: rightTopBarItems()) 尾随项显示良好,但搜索栏不显示。是否可以添加UIViewRepresentable作为navigationBarItem?我在文档中找不到任何东西 搜索条形码: import SwiftUI struct SearchBar: UIViewRepresentable { @Bi
.navigationBarItems(leading: SearchBar(text: $searchText), trailing: rightTopBarItems())
尾随项显示良好,但搜索栏不显示。是否可以添加UIViewRepresentable作为navigationBarItem?我在文档中找不到任何东西
搜索条形码:
import SwiftUI
struct SearchBar: UIViewRepresentable {
@Binding var text: 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.autocapitalizationType = .none
searchBar.searchBarStyle = UISearchBar.Style.minimal
return searchBar
}
func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext<SearchBar>) {
uiView.text = text
}
}
我也有同样的问题。
所以,我放弃了添加UIViewRepresentable,决定直接使用TextField
我希望这能达到你的目的
struct SearchTextField: View {
@State var input: String = ""
@Binding var searchText: String
var body: some View {
HStack {
Image(systemName: "magnifyingglass")
TextField("Search word", text: $input, onCommit: {
self.searchText = self.input
})
}
}
}
final class SearchViewModel: ObservableObject {
@Published var searchText = ""
}
struct ContentView: View {
@ObservedObject var viewModel = SearchViewModel()
var body: some View {
NavigationView {
Text("Hello")
.navigationBarTitle(Text(""), displayMode: .inline)
.navigationBarItems(leading:
HStack {
SearchTextField(searchText: $viewModel.searchText)
}
)
}
}
}
根据我的发现,它现在可以正常工作,仅在列表下的VStack中。你的意思是我应该尝试VStack{List{SearchBartext:$searchText}?不,我使用了VStack{SearchBartext:$searchText List{}},这不会编译,因为List必须返回一些东西。我将其更改为VStack{SearchBartext:$searchText List{EmptyView}},但这仍然不起作用。遗憾的是,此解决方案有一些缺点,最明显的是您无法直接提交每个字母的更改:如果您执行Text\self.input之类的操作,或者如果您有一个基于$input筛选的列表,iOS键盘在每个新字母后关闭。我想这是因为SwiftUI更新了视图,同时决定关闭键盘。我还没有找到解决办法。