我正在使用UINavigationItem的新iOS 11
searchContoller
属性.我正在运行iOS 11.0 GM build.
当我在搜索控制器处于活动状态时执行push segue时,它可以正常工作.当我随后弹回时,搜索栏将折叠并在状态栏中压缩.我无法取消搜索,或编辑搜索文本.
请参阅以下图像序列:
最终图像显示在pop segue期间表格的出现,以便从呈现的视图控制器返回到具有搜索栏的表格.奇怪的是,这并不总是发生.它发生在90%的时间,但有时它表现得很好.我还没有弄清楚我在做什么,以使其发挥作用.一旦搜索栏被压扁,我必须强制关闭应用程序以恢复合理的状态.
设置搜索控制器的代码非常标准. viewDidLoad()的相关位如下:
searchController = UISearchController(searchResultsController: nil) searchController.dimsBackgroundDuringPresentation = false searchController.searchBar.returnKeyType = .done searchController.searchBar.placeholder = "Your Library" searchController.searchBar.searchBarStyle = .minimal // We will manage the clearing of selections ourselves. cleaRSSelectionOnViewWillAppear = false // Some search bar styles are slightly different on iOS 11 if #available(iOS 11.0,*) { navigationItem.searchController = searchController navigationController!.navigationBar.prefersLargeTitles = true } else { searchController.searchBar.backgroundColor = tableView.backgroundColor! searchController.hidesNavigationBarDuringPresentation = false tableView.tableHeaderView = searchController.searchBar tableView.setContentOffset(CGPoint(x: 0,y: searchController.searchBar.frame.height),animated: false) }
我也注意到Apple的Messages应用程序中的这个问题(见下面的截图),以及Settings,Notes和Mail,所以这可能是iOS 11的错误.
只有在设置中使用小于默认文本大小时才会出现这种情况 – >一般 – >辅助功能 – >较大的文本,似乎只发生在物理设备上(没有在模拟器中重现).在viewDidAppear中,searchController.searchBar.frame.height等于0(但不在viewDidDisappear中,而不是viewWillAppear).到目前为止我唯一的解决方法是:
override func viewDidAppear(_ animated: Bool) { if #available(iOS 11.0,*),searchController.searchBar.frame.height == 0 { navigationItem.searchController?.isActive = false } super.viewDidAppear(animated) }
解决方法
这个bug可以在iOS 11.1中重现:
- (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.hidesSearchBarWhenScrolling = NO; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; if (@available(iOS 11.0,*)) { self.navigationItem.hidesSearchBarWhenScrolling = YES; } }
在VC生命周期事件上避免mutate navigationItem,修复了我的问题