iOS 12中视图层次结构中缺少搜索栏

6

我有一个UISearchController,其中searchBar分配给了我的视图控制器的导航项。在iOS 13.3中,一切正常。然而,在iOS 12.4中,searchBar已经消失,似乎没有被添加到视图层次结构中。

以下是iOS 13.3中的UI界面:

输入图像描述

以下是iOS 12.4中相同的UI界面:

输入图像描述

我的代码配置搜索控制器如下:

self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.obscuresBackgroundDuringPresentation = NO;

NSString *placeholder = NSLocalizedString(@"Address or place name", nil);

self.searchController.searchBar.placeholder = placeholder;
self.searchController.searchBar.autocapitalizationType = UITextAutocapitalizationTypeNone;
self.searchController.searchBar.autocorrectionType = UITextAutocorrectionTypeNo;
self.searchController.searchBar.delegate = self;

self.definesPresentationContext = YES;

self.navigationItem.hidesSearchBarWhenScrolling = NO;
self.navigationItem.searchController = self.searchController;

[self.searchController.searchBar sizeToFit];

如果我在调试器中输入以下内容来检查搜索栏的视图层次结构:

po self.navigationItem.searchController.searchBar.superview.superview

我在iOS 13.3中看到以下内容:

<UILayoutContainerView: 0x7f8c97b300c0; frame = (0 0; 375 812); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x60000373dd40>; layer = <CALayer: 0x6000038ae620>>

iOS 12.4中的这个功能:

nil

我正在使用 Xcode 版本 11.3.1 (11C504),项目目标是 iOS 12.0。视图控制器从故事板加载,并被配置为 UISplitViewController 的详细视图控制器。

要在 iOS 12 中按预期显示搜索栏,应该采取哪些不同的措施?


同样的情况,我也是这样的。 - Jean Le Moignan
1
并通过浏览调试视图层次结构确认搜索器实例完全不存在。 - Jean Le Moignan
你找到什么可以修复它的东西了吗? - Jean Le Moignan
不是为了修复它,而是我在下面发布了一个解决方法作为答案。 - stephent
2个回答

5
这实际上是由于iOS 12问题与UISearchController的初始化程序有关,该初始化程序以nibName和nibBundle作为其参数,如果您未在自定义UISearchController类中覆盖它,则会遇到上述问题。我只需在我的UISearchController类中实现这个片段就可以解决这个问题:
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

如果您不想子类化UISearchController,则应该使用上述初始化器而不是:

UISearchController(searchResultsController: nil)

2

对于问题描述中的行为没有找到解释,但是通过将iOS 10的回退行为应用于iOS 12,我成功地解决了这个问题:

if (@available(iOS 13, *)) {
    // For iOS 11 and later, place the search bar in the navigation bar.
    self.navigationItem.searchController = self.searchController;

    // Make the search bar always visible.
    self.navigationItem.hidesSearchBarWhenScrolling = NO;
} else {
    // For iOS 10 and earlier, place the search controller's search bar in the table view's header.
    self.tableView.tableHeaderView = self.searchController.searchBar;
}

(这似乎是可以接受的:随着iOS 12从安装基础中逐渐退出,看到回退版本的用户比例将继续下降-对于我应用程序而言,在iOS 13发布后6个月已经低于15%。)


非常感谢,Stephen。我会尽快尝试。 - Jean Le Moignan
1
我曾经遇到一个问题,当我只使用init来初始化搜索栏时,在12.4版本中它没有出现(在真实的iPhone和模拟器上)。但是如果使用initWithResultsController:nil进行初始化,则可以通过下拉使搜索栏出现。在iOS13中,只有当屏幕上无法容纳更多条目时,搜索栏才会在滚动时隐藏。 - ghr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接