ios – UISearchBar将不会在UISplitviewController Master中响应

前端之家收集整理的这篇文章主要介绍了ios – UISearchBar将不会在UISplitviewController Master中响应前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在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上运行时,搜索栏没有得到关注或显示键盘.没有回应,似乎没有接受触动.甚至没有以编程方式尝试成为第一个响应程序.

什么都没发生.

搜索栏是可见的并且放置适当,没有底层或叠加问题.

它在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

解决方法

这显然是UISplitViewController和/或UISearchController中的错误.当然,请提供一个与苹果相关的雷达并附上您的代码示例.

我认为这个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];
}

猜你在找的iOS相关文章