UISearchBar不会在UISplitviewController Master中响应

Dea*_*ids 13 uisplitviewcontroller ios uisearchcontroller

UITableviewUISplitviewController通用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会中断并且不再响应触摸.

如果我从横向开始,然后旋转到肖像,它也会停止工作.旋转回景观并不能解决问题.一旦破裂,它会一直保持破碎状态直到重启.

我试着转向主控制器definesPresentationContextviewWillAppear方法,但这没有效果.

进一步更新:

另一个意想不到的情况是iPhone 6plus上的搜索栏完全没有问题.无论方向,折叠或否,都可以工作,无论它起始于哪个状态都无关紧要.我希望在横向时这与iPad相同.完全工作iPhone.

我还是没想出来.我最近尝试修复,我将所有搜索控制器初始化移动到该viewDidLayoutSubviews方法.没有任何改变.

此外,我注意到当搜索处于活动状态时,键盘在屏幕上,如果我旋转iPad,键盘会消失,但搜索栏仍保持活动状态.起初我没有意识到,然后我看到取消按钮仍然显示.它不会接受触摸,也没有键盘,但它显然仍然是第一响应者.

示例项目上传到GitHub: Github存储库

注意 - 在我将UISplitview Delegate方法添加到项目之前没有问题.我想立即将此问题添加到我的问题中,因此,我还没有尝试确切地看到这些委托方法如何影响搜索栏,但显然问题是在某处创建的.

更新:

我尝试了一些更多的变化没有成功.

  • 将搜索栏移动到节标题.没有快乐.
  • 将搜索栏放在UIView中作为内容视图.没有快乐.
  • 删除搜索栏消失,重新插入确实出现.没有快乐.
  • 操纵搜索栏框的大小以确保它不被剪裁.没有快乐.

我还查看了profiler中的视图层次结构,搜索栏是顶级的,没有被其他任何内容覆盖.

最终包裹:

@tomSwift解决方法在iPad上纠正了我的问题.在进一步测试中,我发现它破坏了我的iPhone UI.据推测,这更多地是我自己的设置和创建主/细节视图控制器的时间问题.似乎一些重要的对象不再及时创建,因为可能还没有详细视图控制器.我通过将关键项目移动到App Delegate中来解决问题,但这变得笨拙并且我无法轻易缩小范围,因此我修复了以下问题:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
}
Run Code Online (Sandbox Code Playgroud)

可能会有更优雅的解决方案,但这需要我足够的时间.现在一切都有效.雷达提交 - 28304096

Tom*_*ift 4

UISplitViewController这显然是和/或中的错误UISearchController。当然,请向 Apple 提交雷达并附上您的代码示例。

我认为该错误涉及UISplitViewController.displayMode UISplitViewControllerDisplayModeAutomatic. 当我将 更改preferredDisplayModeUISplitViewControllerDisplayModeAllVisible时,一切都开始工作:

- (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 上纵向的默认布局,我知道这可能并不理想。我还尝试了最初的设置preferredDisplayModeUISplitViewControllerDisplayModeAllVisible然后将其设置回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)