Доступ к MKMapView через панель вкладок

У меня есть приложение с вкладками, и на первой вкладке у меня есть MKMapView. Что я хочу сделать, так это откуда-то еще в приложении, переключить активную вкладку на представление карты и установить регион просмотра карты на основе данных в предыдущем представлении (тот, у которого есть кнопка для переключения на представление карты).

Что я пробовал:

[self.tabBarController setSelectedView:0];
UIMapViewController *mapView = [self.tabBarController.viewControllers objectAtIndex:0];
[mapView displayBookmarkAnnotation:bookmark];

Это просто приводит к сбою приложения, которое не может найти метод, который я создал. Я не думаю, что выбрал лучший путь для реализации этого, но я действительно не уверен, как мне это сделать.

[Обновление] Приведение контроллера, возвращенного tabBarController, не дало результата.

[Решено] Я пытался добавить UINavigationController в свой mapView

[self.tabBarController setSelectedView:0];
UINavigationController *navController = [self.tabBarController.viewControllers objectAtIndex:0];
//if the tab has other views open, return to mapView
[navController popToRootViewControllerAnimated:YES];
UIMapViewController *mapView = (UIMapViewController *)[navController visibleViewController];
[mapView customMessage:object];

person Affian    schedule 26.01.2010    source источник


Ответы (3)


Вы уверены, что контроллер основного вида для этой вкладки не является UINavigationController? Если это так, вы можете получить контроллер корневого представления для того, что должно быть вашим UIMapViewController.

Было бы хорошо поместить прямую ссылку в AppDelegate, если вы собираетесь вызывать его из другого места.

person Kendall Helmstetter Gelner    schedule 26.01.2010
comment
До сих пор я мало работал с AppDelegate, можно ли получить к нему доступ из любого места в приложении? Судя по названию, можно. - person Affian; 26.01.2010

Почему бы не направить его через AppDelegate? AppDelegate может иметь UITabBarController и MKMapView (оба подключены через построитель интерфейса). Тогда обработчик UIButton также будет в AppDelegate, чтобы он мог вызывать -[UITabBarController setSelectedView:] и -[MKMapView setRegion:].

person John Franklin    schedule 26.01.2010

Что вы хотите сделать, так это создать подкласс или категорию UITabBarController, которая

  1. регистрирует события NotificationCenter, которые вы определяете
  2. обрабатывает события с помощью нового селектора. Я обычно использую для них соглашение об именах do/did.

Когда событие происходит, вы устанавливаете selectedIndex.

person David Sowsy    schedule 26.01.2010