2016-12-29 2 views
0

В моем классе модели я хочу показать предупреждение, когда произойдет что-то плохое (например, сервер отправит ошибку). Тем не менее, я не хочу беспокоиться с делегатом или KVO.Существующий контроллер предупреждений в главном окне приложения?

Есть ли простой способ показать предупреждение для «главного» окна, чтобы разместить представление над другими?

В настоящее время я использую этот код (не работает, если установлено из классов ViewController):

UIAlertController *vc = [UIAlertController alertControllerWithTitle:@"Произошла ошибка" 
                    message:response 
                   preferredStyle:UIAlertControllerStyleAlert]; 
     [self presentViewController:vc animated:YES completion:^{ 

      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
       [vc dismissViewControllerAnimated:YES completion:nil]; 
      }); 
     }]; 

Очевидно, что классы, которые не имеют использовать вид косяка:

[self presentViewController:vc animated:YES completion:^{ 
+0

Почему вы не хотите беспокоиться с делегатом или KVO. –

+0

Эффект @MikeAlter будет таким же, но больше работы. –

+0

одно решение будет помечено предупреждение, показывающее способ appdelegate и показать его с помощью диспетчера верхнего уровня, может помочь –

ответ

1

согласно решению @Ashley Mills Вы можете найти верхний контроллер представления с помощью этого метода

- (UIViewController *)currentTopViewController 
{ 
    UIViewController *topVC = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; 
while (topVC.presentedViewController) 
{ 
    topVC = topVC.presentedViewController; 
} 
if ([topVC isKindOfClass:[UINavigationController class]]) { 
    return [(UINavigationController *)topVC topViewController]; 
} 
return topVC; 
} 

показать вам предупреждение в обратном объекте currentTopViewController метод

+0

Что делать, если в контейнере есть UISplitViewController, а detail viewController представляет модальный (или другие сложные случаи). Будет ли это продолжаться? – SAHM

+0

@SAHM В этом случае я не тестировал этот метод, если у вас есть некоторые улучшения в этом ответе, вы можете предложить или изменить –

1

Вам нужно представить UIAlertController от UIViewController. Если вам нужен главный контроллер представления, вам нужно сделать это из окна приложения делегата rootViewController.

Противный способ сделать это, чтобы обратиться к UIApplication.sharedApplication().delegate.window.rootViewController

Лучше всего было бы отправить уведомление от вашего метода модели и послушать ее в App Делегат

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

Или, возможно, вы могли бы пройти в текущем контроллере представления в качестве параметра метода модели

+0

спасибо, как реализовать его с помощью rootViewController? –

+0

Обновлен ответ –

+1

спасибо за ваш ответ –

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