Хотя это может не совсем соответствовать исходному вопросу, решение все же применимо в более широком смысле, если попытаться настроить кнопку «Отмена» в UISearchBar. Думаю, это поможет другим, кто застрял в таком сценарии.
Моя ситуация состояла в том, чтобы изменить заголовок кнопки отмены, но с поворотом, при котором я не хотел показывать кнопку отмены по умолчанию, а только хотел, чтобы она отображалась, когда пользователь входит в режим поиска (нажав внутри поиск текстового поля). В этот момент я хотел, чтобы кнопка отмены содержала надпись «Готово» («Отмена» придавала другому значению мой экран, отсюда и настройка).
Тем не менее, вот что я сделал (комбинация решений Caelavel и Arenim):
Субклассированный UISearchBar как MyUISearchBar с этими двумя методами:
-(void) setCloseButtonTitle: (NSString *) title forState: (UIControlState)state
{
[self setTitle: title forState: state forView:self];
}
-(void) setTitle: (NSString *) title forState: (UIControlState)state forView: (UIView *)view
{
UIButton *cancelButton = nil;
for(UIView *subView in view.subviews){
if([subView isKindOfClass:UIButton.class])
{
cancelButton = (UIButton*)subView;
}
else
{
[self setTitle:title forState:state forView:subView];
}
}
if (cancelButton)
[cancelButton setTitle:title forState:state];
}
А в viewcontroller, который использует эту панель поиска, следующий фрагмент кода заботится о том, чтобы показать кнопку отмены и настроить ее заголовок:
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
MyUISearchBar *sBar = (MyUISearchBar *)searchBar;
[sBar setShowsCancelButton:YES];
[sBar setCloseButtonTitle:@"Done" forState:UIControlStateNormal];
}
Как ни странно, мне не пришлось ничего делать, чтобы скрыть кнопку отмены, так как она скрыта по умолчанию при выходе из режима поиска.