Панель поиска отсутствует в иерархии представлений в iOS 12 - PullRequest
1 голос
/ 23 января 2020

У меня есть UISearchController с searchBar, назначенным для элемента навигации моего контроллера представления. Все отлично работает в iOS 13.3. Однако в iOS 12.4 панель поиска отсутствует и, по-видимому, не была добавлена ​​в иерархию представлений.

Вот интерфейс пользователя в iOS 13.3:

enter image description here

Здесь то же самое в iOS 12.4:

enter image description here

Мой код для настройки контроллера поиска: следующим образом:

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?

1 Ответ

1 голос
/ 21 февраля 2020

Не найдено объяснения для поведения, описанного в вопросе, но я смог обойти проблему, применив 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 стареет из установленной базы, доля пользователей, видящих резервную версию, будет продолжать снижаться - это уже <15% через 6 месяцев после выпуска iOS 13 для моего приложения.) </p>

...