嵌入Navigation Controller的UISearchController在紧凑屏iOS设备上异常
问题现象
- 初始预期行为:

- 搜索栏激活后的行为:

- 横屏切换后的异常行为:切换至横屏后,键盘收起,搜索栏失焦,且点击Cancel按钮后该按钮无法隐藏

示例代码
class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating { // Table view and search controller private var tableView: UITableView! private var searchController: UISearchController! // Data source private var data: [String] = ["Apple", "Banana", "Orange", "Pineapple", "Grapes", "Watermelon"] private var filteredData: [String] = [] override func viewDidLoad() { super.viewDidLoad() title = "My View Controller" view.backgroundColor = .systemBackground // Set up table view tableView = UITableView() tableView.translatesAutoresizingMaskIntoConstraints = false tableView.dataSource = self tableView.delegate = self view.addSubview(tableView) NSLayoutConstraint.activate([ tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor), tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor), tableView.topAnchor.constraint(equalTo: view.topAnchor), tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) // Set up search controller searchController = UISearchController(searchResultsController: nil) searchController.searchResultsUpdater = self searchController.obscuresBackgroundDuringPresentation = false navigationItem.searchController = searchController navigationItem.hidesSearchBarWhenScrolling = false navigationItem.largeTitleDisplayMode = .always navigationController?.navigationBar.prefersLargeTitles = true definesPresentationContext = true } // MARK: - Table View DataSource func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if isFiltering() { return filteredData.count } else { return data.count } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = UITableViewCell(style: .default, reuseIdentifier: "Cell") let item: String if isFiltering() { item = filteredData[indexPath.row] } else { item = data[indexPath.row] } cell.textLabel?.text = item return cell } // MARK: - Table View Delegate func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) // Handle row selection if needed } // MARK: - Search Controller func updateSearchResults(for searchController: UISearchController) { let searchText = searchController.searchBar.text ?? "" filterContent(for: searchText) } func filterContent(for searchText: String) { filteredData = data.filter { item in return item.lowercased().contains(searchText.lowercased()) } tableView.reloadData() } func isFiltering() -> Bool { return searchController.isActive && !searchBarIsEmpty() } func searchBarIsEmpty() -> Bool { return searchController.searchBar.text?.isEmpty ?? true } }
该示例在常规设备上运行完全正常。
内容的提问来源于stack exchange,提问作者Balaji Royal
相关产品推荐
相关产品推荐

