2013-07-23 2 views
1

Вот что я пытаюсь сделать. Я создаю приложение маршрутизации, которое должно обрабатывать запрос из приложения Apple map. Приложение карта делает так, отправив сообщение на приложение делегатаЛучший способ отклонить модальный вид от делегата приложения

- (BOOL) application: (UIApplication *) application openURL:(NSURL *) url sourcApplication:(NSString *)sourceApplication annotation:(id)annotation

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

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

Как узнать, есть ли модальный вид (или если существует несколько возможных представлений модели, что не так, но я спрашиваю его ради вопроса.) Покрывает его? И я хочу уволить его? Доступно ли это из делегата приложения? Прямо сейчас я просто держу ссылку на указатель контроллера модального представления в этом верхнем виде контроллера стека навигации и отбрасываю контроллер представления, если ссылка не нуль. Делегат приложения просто запрашивает контроллер верхнего уровня для выполнения этой задачи.

Действительно ли это?

ответ

2

Если вы используете навигационный контроллер, вы можете легко получить доступ к его topViewcontroller и проверить, представил ли он другой контроллер вида из класса делегирования приложения. До iOS 6.0 доступным для вас вариантом доступа будет «modalViewController», после чего он будет отмечен как устаревший, поэтому вы должны использовать presentedViewController.

Пример такой проверки будет что-то вроде этого:

// after rearranging view controller hierarchy, check for modal view controllers 

UIViewController *topVc = [navigationController topViewController]; 
if ([vc presentedViewController] != nil) { 
    [vc performSelector:@selector(dismissModalViewControllerAnimated:) 
      withObject:[NSNumber numberWithBool:YES] 
      afterDelay:0.5]; 
} 

Вызова dismissModalViewControllerAnimated: с небольшим опозданием (вы можете настроить его немного) предотвратит любые повреждения анимации из-за просмотр контроллера перегруппировки. Если вы не оживляете эти изменения, должен быть достаточно прямого вызова функции.

Отклонить его, если он присутствует, является правильным способом достижения требуемой функциональности.

+0

Спасибо, связка. :) – huggie

Смежные вопросы