【问题标题】:searchBar missing from view hierarchy in iOS 12iOS 12 中的视图层次结构中缺少 searchBar
【发布时间】:2020-05-10 02:53:18
【问题描述】:

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

这是 iOS 13.3 中的用户界面:

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];

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

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 的详细视图控制器。

我应该做些什么不同的事情来让 searchBar 在 iOS 12 中按预期显示?

【问题讨论】:

  • 这里一样,在同样的情况下......
  • 我通过浏览 Debug View Hierarchy 确认完全没有搜索器实例。
  • 你找到解决办法了吗?
  • 不修复它,但我在下面发布了一个解决方法作为答案。

标签: ios interface-builder uisearchbar uisearchcontroller uinavigationitem


【解决方案1】:

没有找到问题中描述的行为的解释,但我能够通过将 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%。)

【讨论】:

  • 非常感谢,斯蒂芬。会尽快尝试。
  • 如果我只使用 init 初始化它,而不是使用 initWithResultsController:nil(真正的 iPhone 和模拟器),我会遇到搜索栏没有出现在 12.4 中的问题。使用后者使搜索栏出现在下拉菜单中。在 iOS13 中,搜索栏只有在条目数超出屏幕容量时才会在滚动时隐藏。
【解决方案2】:

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

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

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

UISearchController(searchResultsController: nil)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2016-09-03
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多