【发布时间】:2016-09-15 03:09:49
【问题描述】:
我在UISplitviewController 和通用iOS9 应用程序中有一个非常标准的UITableview 设置作为主控制器。
同样,标准票价,我插入了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 上运行时不会获得焦点或显示键盘。没有回应,似乎没有收到触摸。甚至不响应以编程方式尝试becomeFirstResponder。
什么都没有发生。
搜索栏可见且放置得当,没有底层或覆盖问题。
它在iPhone 上运行良好。接收触摸,呈现键盘,搜索作品。当UISplitviewController 被折叠时,大概有一个关键的区别。经过数小时的搜索、翻阅文档和遇到的每个教程,我还没有找到令人惊讶的类似体验。
附加说明:如果我在 iPad 上使用多任务处理将拆分视图缩小到折叠状态,搜索栏就会工作,与 iPhone 上的一样。这肯定与拆分视图的折叠状态有关。
更新:(越来越近)
经过进一步的实验,我发现如果您在横向启动应用程序,搜索栏可以在 iPad 上运行。在纵向模式下,我的主控制器是隐藏的。它通过选择displayModeButtonItem 滑入,该leftBarButtonItem 设置为详细控制器的leftBarButtonItem。那是 searchBar 中断并且不再响应触摸的时候。
如果我从横向开始,然后旋转到纵向,它也会停止工作。旋转回横向并不能解决它。一旦坏了,它就会一直坏,直到重新启动。
我尝试将definesPresentationContext 移动到主控制器的viewWillAppear 方法,但没有效果。
进一步更新:
另外一个意想不到的情况是,iPhone 6plus 上的搜索栏完全没有问题。无论方向如何,折叠或不折叠都可以工作,并且无论它从哪个状态开始都无关紧要。我希望这与 iPad 在横向时相同。完全适用于iPhone。
我还没有弄清楚这一点。我最近尝试修复,我将所有搜索控制器初始化移动到 viewDidLayoutSubviews 方法。没有任何变化。
另外,我注意到当搜索处于活动状态时,屏幕上的键盘,如果我旋转 iPad,键盘会消失,但搜索栏仍然处于活动状态。一开始我没有意识到,然后我看到取消按钮仍然显示。它不会接收触摸,也没有键盘,但它显然仍然是第一响应者。
上传到 GitHub 的示例项目: Github Repository
注意 - 在我将 UISplitview 委托方法添加到项目之前没有问题。我想立即将此添加到我的问题中,因此,我什至还没有尝试确切了解这些委托方法如何影响搜索栏,但显然问题是在某处创建的。
更新:
我尝试了更多变体,但没有成功。
- 将搜索栏移至章节标题。不开心。
- 将搜索栏作为内容视图放在 UIView 中。不开心。
- 删除搜索栏消失,重新插入确实出现。不开心。
- 调整搜索栏框架的大小以确保它不被剪裁。不开心。
我还查看了分析器中的视图层次结构,搜索栏是顶级的,没有被其他任何东西覆盖。
最终包装:
@tomSwift 解决方法确实纠正了我在 iPad 上的问题。在进一步测试中,我发现它破坏了我的 iPhone UI。据推测,这更多是我自己的设置和创建主/详细视图控制器的时间问题。似乎一些重要的对象不再及时创建,因为细节视图控制器可能还不存在。我通过将关键项目移动到 App Delegate 中进行了修复,但这变得笨拙,我无法轻松缩小范围,因此我通过以下方式破解了修复程序:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
}
可能会有一个更优雅的解决方案,但这已经占用了我足够多的时间。现在一切正常。雷达归档- 28304096
【问题讨论】:
-
Dean,请提供一个演示项目,在此重现。
-
@LeoNatan,我确实设法重现了该问题并将示例项目上传到 github。谢谢。
-
@Dean 您的示例项目缺少文件;不会在 Xcode 中打开和构建。例如。缺少 Main.storyboard 和 LaunchScreen.storyboard
-
我已经有一段时间没有放东西了。我会尽快检查并修复。
-
根据this,您不应该在导航堆栈上使用 UISplitViewControllers,但您的主视图和详细视图都嵌套在导航控制器下。您可以尝试删除这些。
标签: ios uisplitviewcontroller uisearchcontroller