Dea*_*ids 13 uisplitviewcontroller ios uisearchcontroller
我UITableview在UISplitviewController通用iOS9应用程序中有一个非常标准的主控制器设置.
再次,标准票价,我插入一个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;
Run Code Online (Sandbox Code Playgroud)
无需显示我的其余代码,搜索和所有按预期工作的内容iPhone.我的问题是搜索栏在运行时不会获得焦点或显示键盘iPad.没有回应,似乎没有接受.甚至没有响应以编程方式尝试becomeFirstResponder.
什么都没发生.
搜索栏可见且放置正确,没有底衬或叠加问题.
它工作正常iPhone.接收触摸,呈现键盘,搜索工作.据推测,UISplitviewController折叠时的呈现方式存在重大差异.通过几个小时的搜索,浏览文档和我遇到的每个教程,我都没有找到类似的经历,这是令人惊讶的.
附加说明:如果我使用多任务处理将分割视图缩小到iPad上折叠,则搜索栏将起作用,与之相同iPhone.它肯定与拆分视图的折叠状态有关.
经过进一步的实验,我发现如果您在横向上启动应用程序,搜索栏将在iPad上运行.在纵向模式下,我的主控制器被隐藏.它通过选择displayModeButtonItem设置为leftBarButtonItem细节控制器的滑入.那时,searchBar会中断并且不再响应触摸.
如果我从横向开始,然后旋转到肖像,它也会停止工作.旋转回景观并不能解决问题.一旦破裂,它会一直保持破碎状态直到重启.
我试着转向主控制器definesPresentationContext的viewWillAppear方法,但这没有效果.
另一个意想不到的情况是iPhone 6plus上的搜索栏完全没有问题.无论方向,折叠或否,都可以工作,无论它起始于哪个状态都无关紧要.我希望在横向时这与iPad相同.完全工作iPhone.
我还是没想出来.我最近尝试修复,我将所有搜索控制器初始化移动到该viewDidLayoutSubviews方法.没有任何改变.
此外,我注意到当搜索处于活动状态时,键盘在屏幕上,如果我旋转iPad,键盘会消失,但搜索栏仍保持活动状态.起初我没有意识到,然后我看到取消按钮仍然显示.它不会接受触摸,也没有键盘,但它显然仍然是第一响应者.
示例项目上传到GitHub: Github存储库
注意 - 在我将UISplitview Delegate方法添加到项目之前没有问题.我想立即将此问题添加到我的问题中,因此,我还没有尝试确切地看到这些委托方法如何影响搜索栏,但显然问题是在某处创建的.
我尝试了一些更多的变化没有成功.
我还查看了profiler中的视图层次结构,搜索栏是顶级的,没有被其他任何内容覆盖.
@tomSwift解决方法在iPad上纠正了我的问题.在进一步测试中,我发现它破坏了我的iPhone UI.据推测,这更多地是我自己的设置和创建主/细节视图控制器的时间问题.似乎一些重要的对象不再及时创建,因为可能还没有详细视图控制器.我通过将关键项目移动到App Delegate中来解决问题,但这变得笨拙并且我无法轻易缩小范围,因此我修复了以下问题:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
}
Run Code Online (Sandbox Code Playgroud)
可能会有更优雅的解决方案,但这需要我足够的时间.现在一切都有效.雷达提交 - 28304096
UISplitViewController这显然是和/或中的错误UISearchController。当然,请向 Apple 提交雷达并附上您的代码示例。
我认为该错误涉及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;
}
Run Code Online (Sandbox Code Playgroud)
这次改变的主要内容是 iPad 上纵向的默认布局,我知道这可能并不理想。我还尝试了最初的设置preferredDisplayMode,UISplitViewControllerDisplayModeAllVisible然后将其设置回UISplitViewControllerDisplayModeAutomatic;这一直很有效,直到屏幕方向发生变化 - 然后一切又坏了。你可能会运气好,沿着这条路走得更远。
我还在 中添加了以下内容AppDelegate,以强制搜索控制器在displayMode更改时停用。(我还必须searchController在 MasterViewController 上公开公开该属性)。
- (void)splitViewController:(UISplitViewController *)svc willChangeToDisplayMode:(UISplitViewControllerDisplayMode)displayMode {
UINavigationController *navigationController = [svc.viewControllers firstObject];
MasterViewController* mvc = (MasterViewController*) navigationController.topViewController;
[mvc.searchController setActive: NO];
}
Run Code Online (Sandbox Code Playgroud)