iOS: Установка текста в подвиде кончика из представления в приложении UITabBar / UINavigationController

#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 а затем сделайте делегирование своим другом (которым оно уже является), я привел пример на случай, если кому-нибудь понадобится его повторить, который я разместил в своем блоге ЗДЕСЬ.

http://www.jamesrbrindle.com/developer/ios-developer/howto-add-a-custom-uinavigationitem-to-a-uinavigationcontroller-with-delegation.htm

Если кто-то не согласен и думает, что это может быть проще, пожалуйста, дайте мне знать или оцените этот пост