公司混不下去。。没开让我转别的。。社畜很感激。
干到一半。老项目又要改,searchDisplayController ios13闪退。
嗯。瞄一眼。苹果估计是不乐意写兼容代码或者想减少下自己的体积。。所以么。。直接报错。
那么就改喽,改成UISearchController.记录下遇到的坑点。免得以后再遇到不知所措,被水淹没。
1.searchBar的问题。
searchDisplayController是传入searchBar的。。UISearchController是提供searchBar的。。2者不可兼得。。对于项目里自定义searchBar多的比较麻烦,而且我们的项目headerView都是自定义的。searchBar在headerView里。。
解决方法么。。继承UISearchController。自己写一个。然后重写searchBar方法。把自定义searchBar的实例返回回去。。
-(UISearchBar *)searchBar{
return self.customSearchBar;
}
-(UISearchBar *)customSearchBar{
if (_customSearchBar) {
return _customSearchBar;
}else{
if(customCls) {
_customSearchBar=[customCls new];
}
if (!_customSearchBar) {
_customSearchBar=[UISearchBarnew];
}
return _customSearchBar;
}
}
类似于这样。。
要是每个页面还有不一样的。只能去外面自定义了。。然后包含自定义searchBar的只能被动接受传入的searchBar了(怪以前偷懒,searchBar直接在自定义view里new的。。)。
第二坑。激活的时候seachBar位置各种不对。。鬼知道苹果怎么算得。反正就是激活的时候你的searchBar会从原始图中被苹果移动到searchController里。因为好像就是present出来的。。然后去掉了再帮你移动回去。
所以我暂时就只有硬编码解决了
-(void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
//修改searchbar偏移问题
//奇葩的偏移修复。硬编码
if(self.view.subviews.count==2&&self.isActive) {
UIView*container=nil;
UIView*another=nil;
for(UIView*subViewinself.view.subviews) {
if ([NSStringFromClass(subView.class) containsString:@"SearchBar"]) {
container=subView;
}else{
another=subView;
}
}
if(container.top!=CGRectGetMaxY([UIApplicationsharedApplication].statusBarFrame)) {
container.top=CGRectGetMaxY([UIApplicationsharedApplication].statusBarFrame);
self.searchBar.top=container.top;
another.top=container.bottom;
another.height=self.view.height-another.top;
}
}
}
这代码到ios13.2都是好的。
3.黑屏。
因为我们是tab+navi+vc。这样的UI架构。然后search激活的时候要求不隐藏底部tabbar。就有被点击移动到别的tab的可能性。
然后发现点过去,,回来。。背景黑了。vc也没释放啊。。好了又是present的坑。设置跳转控制器为包含searchBar的VC就行。
vc.definesPresentationContext=YES;
哎。。ios行情真的不好啊。