Я нашел другой способ заставить его работать в iOS 7.
То, что я пытаюсь сделать, это что-то вроде приложения iOS для Twitter. Если щелкнуть увеличительное стекло на вкладке «Временные шкалы», появится UISearchBar
с активированной кнопкой «Отмена», отображением клавиатуры и экраном недавних поисков. Прокрутите экран недавних поисков, и он скрывает клавиатуру, но при этом кнопка «Отмена» остается активной.
Это мой рабочий код:
UIView *searchBarSubview = self.searchBar.subviews[0];
NSArray *subviewCache = [searchBarSubview valueForKeyPath:@"subviewCache"];
if ([subviewCache[2] respondsToSelector:@selector(setEnabled:)]) {
[subviewCache[2] setValue:@YES forKeyPath:@"enabled"];
}
Я пришел к этому решению, установив точку останова на моем табличном представлении scrollViewWillBeginDragging:
. Я заглянул в свой UISearchBar
и обнажил его подпредставления. Он всегда имеет только один тип UIView
(моя переменная searchBarSubview
).
Затем, что UIView
содержит NSArray
с именем subviewCache
, и я заметил, что последний элемент, который является третьим, имеет тип UINavigationButton
, а не в публичном API. Поэтому я решил использовать кодирование ключ-значение. Я проверил, отвечает ли UINavigationButton
на setEnabled:
, и, к счастью, это так. Поэтому я установил свойство на @YES
. Оказывается, что UINavigationButton
является кнопкой Отмена.
Это обязательно сломается, если Apple решит изменить реализацию внутренностей UISearchBar
, но какого черта. Пока работает.