#ios #uinavigationcontroller #uitabbarcontroller #uisearchbar
#iOS #uinavigationcontroller #uitabbarcontroller #панель пользовательского поиска
Вопрос:
У меня возникла проблема с получением текстового значения UISearchDisplay, которое должно быть установлено программно при загрузке представления другим представлением, и мой вопрос заключается в том, что я слишком усложнил свою проблему и что-то пропустил, или я на правильном пути мышления.
Вот ситуация: у меня есть UITabBarController в качестве моего корневого представления, есть 2 вкладки, на обеих есть настройка UINavigationController, поэтому я могу отправлять представления по мере необходимости.
На вкладке 1 есть UITableViewController, который заполнен списком категорий.
На вкладке 2 есть MapView в основном представлении, но я создал пользовательский вид UINavigationItem, чтобы поместить различные кнопки и UISearchDisplay в область rightBarButtonItem.
Макет mapview и пользовательский элемент навигации хранятся в том же «перо», что и два отдельных объекта view. В viewDidLoad () вкладки 2 я программно инициализирую rightBarButtonItem с помощью:
UIBarButtonItem *btnItem = [[UIBarButtonItem alloc] initWithCustomView:buttonBar];
self.navigationItem.rightBarButtonItem = btnItem;
[btnItem release];
Все запускается, панель кнопок подключена к 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: — есть ли способ сделать это?
На данный момент я внедрил поиск в очереди, проверьте подход к поиску в очереди, это кажется немного затянутым.
Ответ №1:
Хорошо, мне не нравится отвечать на мой собственный вопрос, но, похоже, мои опасения были верны, в принципе, если вы хотите UINavigationItem, который является пользовательским представлением (т. Е. для размещения панели поиска и различных других кнопок на контроллере навигации) и иметь возможность переключаться и заполнять их с другой вкладки на контроллере панели вкладок, тогда вам нужно поместить подзаголовок в его собственный класс, который является подклассом UIViewController а затем сделайте делегирование своим другом (которым оно уже является), я привел пример на случай, если кому-нибудь понадобится его повторить, который я разместил в своем блоге ЗДЕСЬ.
Если кто-то не согласен и думает, что это может быть проще, пожалуйста, дайте мне знать или оцените этот пост