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更新了视图,同时决定关闭键盘。我还没有找到解决办法。