我有一个UITableView
,其中一个搜索栏以编程方式插入到表格中headerView
:
override func viewDidLoad() {
super.viewDidLoad()
resultSearchController = UISearchController(searchResultsController: nil)
resultSearchController.searchResultsUpdater = self
resultSearchController.dimsBackgroundDuringPresentation = false
resultSearchController.searchBar.delegate = self
resultSearchController.searchBar.placeholder = "Search Contacts"
resultSearchController.searchBar.scopeButtonTitles = ["All", "Title1", "Title2", "Title3"]
tableView.tableHeaderView = resultSearchController.searchBar
resultSearchController.searchBar.sizeToFit()
definesPresentationContext = true
tableView.tableFooterView = UIView(frame: CGRectZero)
}`
该表被设置为基于标准UINavigationController
的向下钻取 - 选择一行推入详细视图控制器。
一切都在纵向或横向上完美运行,但如果在显示时旋转了细节视图,则会发生故障。确切的顺序是:
当表格视图重新出现时,搜索栏的所有单个元素都已被"折叠"在彼此之上,整个事物覆盖状态栏:
我已经尝试了各种方法在viewDidAppear
中明确设置搜索栏的框架,以及从标题视图中删除并替换它 - 但问题仍然存在。
我还注意到来自https://developer.apple.com/library/prerelease/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html的Apple示例代码存在类似问题:
有没有人为此做出解决方法?
已编辑添加:
在进一步挖掘时,看起来问题是旋转后导航栏消失了 - 在此之前:
之后:
那么,有什么想法吗?
答案 0 :(得分:1)
在注意到非活动searchBar
似乎没有出现此问题后,我已成功保存搜索栏状态,当视图消失并在视图重新出现之前恢复它。
示例代码可以正常进行以下更改。保存状态:
- (void)viewDidDisappear:(BOOL)animated
{
if (self.searchController.active && self.searchController.searchBar.text.length > 0) {
self.savedSearch = self.searchController.searchBar.text;
[self disableSearch];
} else if (self.searchController.active) {
// empty search field - this won't get restored
[self disableSearch];
}
[super viewDidDisappear:animated];
}
- (void)disableSearch
{
if (self.searchController.isActive) {
self.searchController.searchBar.text = @"";
self.searchController.active = NO;
}
}
恢复:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (self.savedSearch) {
NSLog(@"RESTORED SEARCH");
self.searchController.searchBar.text = self.savedSearch;
self.searchController.searchBar.showsCancelButton = YES;
self.searchController.active = YES;
self.savedSearch = nil;
}
}
无论是否设置了self.searchController.hidesNavigationBarDuringPresentation
,这似乎都可以正常工作(尽管如果true
返回到视图时会有一些动画)。