再次,标准票价,我插入一个UISearchBar作为表头.
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; self.searchController.searchResultsUpdater = self; self.searchController.dimsBackgroundDuringPresentation = NO; self.searchController.hidesNavigationBarDuringPresentation = NO; [self.searchController.searchBar sizeToFit]; self.tableView.tableHeaderView = self.searchController.searchBar; self.definesPresentationContext = YES;
在iPhone上不需要显示我的代码,搜索和所有工作,如预期的.我的问题是,在iPad上运行时,搜索栏没有得到关注或显示键盘.没有回应,似乎没有接受触动.甚至没有以编程方式尝试成为第一个响应程序.
什么都没发生.
搜索栏是可见的并且放置适当,没有底层或叠加问题.
它在iPhone上正常工作.接受触摸,呈现键盘,搜索作品.当UISplitviewController崩溃时,可能会有显着的差异.有了几个小时的搜索,通过文档和我遇到的每个教程,我没有找到类似的经验,这是令人惊讶的.
附加说明:如果我使用多任务来缩小拆分视图以在iPad上折叠,则搜索栏的工作方式与iPhone相同.它绝对与拆分视图的折叠状态有关.
更新:(越来越近)
经过进一步的实验,我发现搜索栏在iPad上运行,如果你开始在这个应用程序.在纵向模式下,我的主控制器被隐藏.它通过选择displayModeButtonItem进行滑动,该DisplayModeButtonItem设置为详细控制器的leftBarButtonItem.那就是当searchBar中断并且不再响应触摸时.
如果我从风景开始,然后旋转到纵向,它也停止工作.旋转回景观不能修复它.一旦破裂,它一直崩溃,直到重新启动.
我尝试将definePresentationContext移动到主控制器的viewWillAppear方法,但没有任何效果.
进一步更新:
另一个意想不到的情况是,iPhone 6plus上的搜索栏完全没有问题.无论方向如何,折叠或不起作用,无论哪个状态开始都不重要.我希望在横向上与iPad相同.完全在iPhone上工作
我还没有想到这一点.我最近尝试修复,我将所有的搜索控制器初始化移动到viewDidLayoutSubviews方法.没有变化
此外,我注意到,当搜索激活时,屏幕上的键盘,如果我旋转iPad,键盘会消失,但搜索栏保持活动.我没有意识到,然后我看到取消按钮仍然显示.它不会接收到触摸,没有键盘,但它显然仍然是第一响应者.
示例项目上传到GitHub:
Github Repository
注意:直到我将UISplitview Delegate方法添加到项目中才有问题.我想立即将其添加到我的问题中,所以我甚至还没有试图看到这些委托方法如何影响搜索栏,但显然问题是在某处创建的.
更新:
我尝试了更多的变化,没有成功.
>将搜索栏移动到节标题.没有快乐
>将搜索栏放在UIView中作为内容视图.没有喜悦
>删除搜索栏消失,重新插入就出现了.没有喜悦
>操作搜索栏框的大小,以确保它不被剪切.没有喜悦
我也在分析器中查看视图层次结构,搜索栏是顶级的,没有被其他任何东西覆盖.
最后包装:
@tomSwift解决方法在iPad上更正了我的问题.进一步测试,我发现它打破了我的iPhone界面.大概这是我自己的设置和创建主/详细视图控制器的时间更多的问题.似乎一些重要的对象不再是及时创建的,因为细节视图控制器还不存在.我通过将关键项目移动到App Delegate中来解决问题,但这变得笨拙,我无法轻松缩小,所以我用
if (UI_USER_INTERFACE_IdioM() == UIUserInterfaceIdiomPad) { splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible; }
可能会有一个更优雅的解决方案,但这已经足够了我的时间.一切工作现在雷达提交 – 28304096
解决方法
我认为这个bug涉及UISplitViewController.displayMode UISplitViewControllerDisplayModeAutomatic.当我将preferredDisplayMode更改为UISplitViewControllerDisplayModeAllVisible时,一切都开始工作:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem; splitViewController.delegate = self; splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible; return YES; }
这个改变的主要原因是iPad上的纵向的默认布局,我明白可能不是理想的.我也玩过设置首选显示模式到UISplitViewControllerDisplayModeAllVisible,然后将其设置回UISplitViewControllerDisplayModeAutomatic;这一切都很好,直到屏幕方向发生变化,然后再次破裂.你可能会有一些运气进一步走下去.
我还在AppDelegate中添加了以下内容,强制搜索控制器在displayMode更改时停用. (我还必须在MasterViewController上公开公开searchController属性).
- (void)splitViewController:(UISplitViewController *)svc willChangeToDisplayMode:(UISplitViewControllerDisplayMode)displayMode { UINavigationController *navigationController = [svc.viewControllers firstObject]; MasterViewController* mvc = (MasterViewController*) navigationController.topViewController; [mvc.searchController setActive: NO]; }