iOS 12 中的视图层次结构中缺少 searchBar

Ste*_*enT 5 interface-builder uisearchbar uinavigationitem ios uisearchcontroller

我有一个 UISearchController 和 searchBar 分配给我的视图控制器的导航项。在 iOS 13.3 中一切正常。但是,在 iOS 12.4 中,searchBar 缺失并且似乎尚未添加到视图层次结构中。

这是 iOS 13.3 中的 UI:

在此处输入图片说明

在 iOS 12.4 中也是如此:

在此处输入图片说明

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

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];
Run Code Online (Sandbox Code Playgroud)

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

po self.navigationItem.searchController.searchBar.superview.superview
Run Code Online (Sandbox Code Playgroud)

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

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

这在 iOS 12.4 中:

nil
Run Code Online (Sandbox Code Playgroud)

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

我应该怎么做才能让 searchBar 在 iOS 12 中按预期显示?

小智 5

这实际上是因为 iOS 12 的UISearchController初始化程序存在问题,该初始化程序将 nibName 和 nibBundle 作为其参数,如果您没有在自定义UISearchController类中覆盖它,您将面临上述问题。我只是通过在我的UISearchController班级中实现这个片段来解决这个问题:

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
Run Code Online (Sandbox Code Playgroud)

如果你不想子类化,UISearchController你应该实现上面的初始化器而不是:

UISearchController(searchResultsController: nil)
Run Code Online (Sandbox Code Playgroud)


Ste*_*enT 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;
}
Run Code Online (Sandbox Code Playgroud)

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