1

升级到 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()
    }
}

}

4

0 回答 0