У меня есть UISearchBar, и я хочу отобразить другой UIViewController, когда я нажимаю кнопку поиска в UISearchBar. Я использую для этого следующий метод:
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main"
bundle:nil];
UIViewController *add =
[storyboard instantiateViewControllerWithIdentifier:@"mainMenuViewController"];
[self.navigationController pushViewController:add animated:YES];
}
Проблема в том, что анимация появления UIViewController вызывается дважды. Я вижу два раза слайд старого контроллера справа налево.
Теперь, если я использую тот же код для отображения нового контроллера при нажатии на какой-либо обычный UIButton, проблема с анимацией исчезнет. Так что, похоже, это как-то связано с UISearchBar.
Метод делегата searchBarSearchButtonClicked вызывается только один раз.
Код для воспроизведения проблемы очень минимален, возможно, я приложу пример проекта чуть позже.
А вот UIVIewCONtroller с панелью поиска выглядит так:
- (void)viewDidLoad {
[super viewDidLoad];
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
searchBar.placeholder = NSLocalizedString(@"search a pub or a place", nil);
searchBar.delegate = self;
[self.navigationItem setTitleView:searchBar];
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
DLog(@"Filter searchBarSearchButtonClicked");
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main"
bundle:nil];
UIViewController *add =
[storyboard instantiateViewControllerWithIdentifier:@"mainMenuViewController"];
[self.navigationController pushViewController:add animated:YES];
}
Проблема как на iOS 8, так и на 9.
Изменить:
Я загрузил образец проекта здесь. Это очень минималистично.
Изменить2:
Если я представляю контроллер так, а не через контроллер навигации, анимация отображается только один раз. (Хотя это другая анимация - снизу вверх, предыдущая была справа налево). Но мне нужно сделать это через навигационный контроллер. Таким образом, проблема, похоже, связана с UISearchBar Search + Navigation Controller.
[self presentViewController:add
animated:YES
completion:nil];
Конечно, я также могу вызвать это без анимации, например:
[self.navigationController pushViewController:add animated:NO];
Но что, если я хочу анимацию.
Изменить3:
Я попытался отобразить второй контроллер через переход, но это не помогло.
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
[self performSegueWithIdentifier:@"seg1" sender:self];
}
Изменить4:
Я сообщил об этой ошибке в Apple, потому что я предполагаю, что это ошибка в UIKit. В любом случае, если кто-то найдет обходной путь, будет хорошо.
self performSelector
. - person danh   schedule 01.07.2016