升级到 iOS 版本 14.5 时开始出现以下错误。它在 14.4 版本中运行良好,没有任何问题。这与搜索栏有关。键入文本时,它不会打开键盘并冻结屏幕。它应该显示以下错误消息,该消息不够清晰,无法修复。
“[Assert] 有人在搜索栏可见时删除了活动的搜索控制器。UI 可能看起来很糟糕。搜索控制器被删除:<UISearchController: 0x7f8d75c86000> 从导航项:”
它是用 SWIFT UI 编写的
代码使用
struct SearchBarView: UIViewControllerRepresentable 创建 searchBar
使用最新版本的 Xcode 12.5 和 Simulator iOS 14.5
有解决办法吗?欢迎提出解决问题的建议。
代码片段:
导入 Foundation 导入 SwiftUI 导入 Combine
结构 SearchBarView: UIViewControllerRepresentable {
@Binding var text: String
@Binding var scopeTitles: [String]
@Binding var selectedScopeIndex: Int
init(text: Binding<String>, scopeTitles: Binding<[String]>, selectedScopeIndex: Binding<Int>) {
self._text = text
self._scopeTitles = scopeTitles
self._selectedScopeIndex = selectedScopeIndex
}
func makeUIViewController(context: Context) -> SearchBarWrapperController {
return SearchBarWrapperController()
}
func updateUIViewController(_ controller: SearchBarWrapperController, context: Context) {
controller.searchController = context.coordinator.searchController
}
func makeCoordinator() -> Coordinator {
return Coordinator(text: $text, scopeTitles: $scopeTitles, selectedScopeIndex: $selectedScopeIndex)
}
class Coordinator: NSObject, UISearchResultsUpdating {
@Binding var text: String
@Binding var scopeTitles: [String]
@Binding var selectedScopeIndex: Int
let searchController: UISearchController
private var subscription: AnyCancellable?
init(text: Binding<String>, scopeTitles: Binding<[String]>, selectedScopeIndex: Binding<Int>) {
self._text = text
self._scopeTitles = scopeTitles
self._selectedScopeIndex = selectedScopeIndex
self.searchController = UISearchController(searchResultsController: nil)
super.init()
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = false
searchController.obscuresBackgroundDuringPresentation = false
searchController.automaticallyShowsScopeBar = false
searchController.searchBar.scopeButtonTitles = scopeTitles.wrappedValue
searchController.searchBar.showsScopeBar = true
self.searchController.searchBar.text = self.text
self.subscription = self.text.publisher.sink { _ in
self.searchController.searchBar.text = self.text
}
}
deinit {
self.subscription?.cancel()
}
func updateSearchResults(for searchController: UISearchController) {
guard let text = searchController.searchBar.text else { return }
DispatchQueue.main.async {
self.text = text
self.selectedScopeIndex = searchController.searchBar.selectedScopeButtonIndex
}
}
}
class SearchBarWrapperController: UIViewController {
var searchController: UISearchController? {
didSet {
self.setupView()
}
}
override func viewWillAppear(_ animated: Bool) {
self.setupView()
}
override func viewDidAppear(_ animated: Bool) {
self.setupView()
}
func setupView() {
self.parent?.navigationItem.searchController = searchController
self.parent?.navigationItem.hidesSearchBarWhenScrolling = false
self.parent?.navigationController?.navigationBar.sizeToFit()
}
}
}