У меня проблема с получением текстового значения UISearchDisplay для программной установки при загрузке представления другим представлением, и мой вопрос: я слишком усложнил свою проблему и что-то пропустил, или я на правильном пути мышления.
Вот ситуация: у меня UITabBarController в качестве моего корневого представления, есть 2 вкладки, обе имеют настройку UINavigationController, поэтому я могу выдвигать представления при необходимости.
На вкладке 1 имеется UITableViewController, который заполняется списком категорий.
Tab 2 имеет MapView в своем основном виде, но я сделал пользовательское представление UINavigationItem, чтобы поместить различные кнопки и UISearchDisplay в область rightBarButtonitem.
Макет просмотра карты и пользовательский элемент навигации хранятся в том же самом наконечнике, что и два отдельных объекта просмотра. В viewDidLoad () на вкладке 2 я программно инициализирую rightBarButtonItem следующим образом:
UIBarButtonItem *btnItem = [[UIBarButtonItem alloc] initWithCustomView:buttonBar];
self.navigationItem.rightBarButtonItem = btnItem;
[btnItem release];
Все запускается, buttonBar подключен к IBOutlet как searchWhat, и я могу общаться с этим объектом из класса контроллера mapview.
Если пользователь находится на вкладке 1 и нажимает на ячейку, я хочу, чтобы он переключился на вкладку 2 и заполнил searchWhat.text, а затем выполнил код поиска, как если бы кто-то сам набрал в поиске.
У меня проблемы с порядком загрузки и заполнения представления.
Я могу получить доступ ко 2-й вкладке из 1-й без каких-либо проблем и заставить ее появляться с чем-то вроде:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"Quick Category cell tapped at row %d", indexPath.row);
self.tabBarController.selectedIndex = 1; // change to the search view controller
//[self.tabBarController.selectedViewController viewDidAppear:YES];
UINavigationController *nav = (UINavigationController *)self.tabBarController.selectedViewController;
SearchViewController *srch = [nav.viewControllers objectAtIndex:0];
//NSLog(@"%@", [srch description]);
[srch queueSearchByType:kSearchTypeQuickCategories withData:[catList objectAtIndex:indexPath.row]];
[srch viewDidAppear:YES];
}
Не беспокойтесь о catList и SearchViewController, они существуют, и этот бит работает для переключения вкладок.
В этом и заключается проблема, если пользователь запускает приложение и выбирает элемент на вкладке 1, появляется вкладка 2, но значения текста для отображения поиска не устанавливаются - поскольку viewDidLoad и viewDidAppear вызываются в другом потоке, поэтому выполнение queueSearchByType: withData: вызывается, когда представление все еще загружается и настраивается.
Если пользователь выбирает вкладку 2 (поэтому инициализирует подпредставление), а затем выбирает вкладку 1 и элемент, он может заполнить текст дисплея поиска.
Я не могу просто изменить порядок вкладок, чтобы tab2 был первым и, следовательно, загружал свои подпредставления в панель навигации, поскольку спецификация проекта - это поиск по категории в первую очередь.
Я что-то упустил очень простой? Что мне нужно сделать, это дождаться полного появления второй вкладки перед вызовом queueSearchByType: withData: - есть ли способ сделать это?
В данный момент я реализовал поиск в очереди, проверил подход поиска в очереди, кажется, это немного затянуто.