2012-05-19 9 views
9

Muszę sprawdzić, czy nadal jest modalny widok na kontroler widoku root. Problem, przed którym stoję, polega na tym, że mam drugi widok modalny pochodzący z jakiegoś wątku, który musi zostać wyświetlony. Chcę opóźnić drugi widok modalny, dopóki nie zniknie pierwszy. Nie mogę go uruchomić po usunięciu pierwszego, ponieważ drugi widok modalny jest warunkowy.Jak mogę sprawdzić, czy widok modalny jest aktualnie nad moim self.window.rootViewController?

[self.window.rootViewController presentModalViewController:vc animated:YES]; 

Co chcę zrobić (nie krępuj się sugerować lepszy alternatywny sposób):

  1. Sprawdź, czy self.window.rootViewController obecnie modalne widok wyświetlany na górze (lub nadal jest animowanie modalne widoku).
  2. użycie performSelector:afterDelay:0.1
  3. Sprawdź ponownie, a jeśli to konieczne, ponownie opóźnić

Odpowiedz

13

Uzyskaj rootViewController.presentedViewController (dostępny w iOS 5.0+) lub rootViewController.modalViewController (dostępny w iOS 2.0+) i sprawdź, czy jest zerowy.

Również ty nie chcą zaprezentować drugi kontroler widoku z wątku wtórnym, wszystko UI rzeczy ma być zrobione na głównym wątku.

+0

To jest w porządku prawda? "Dispatch_async (dispatch_get_main_queue()^{ MedicationReminderViewController * vc = [[MedicationReminderViewController Alloc] initWithNibName: @" MedicationReminderViewController ": zerowe wiązki]; [theDelegate.window.rootViewController presentModalViewController VC animowany: TAK]; })"; – Pieter

+0

@Pieter, To jest w porządku, tak, ten kod zostanie wykonany na głównym wątku – tux91

+0

Przypuszczam, że rootViewController.modalViewController jest dowolnym modalViewController, który jest wyświetlany modalnie na rootViewController? – Pieter

0

będę mieć ochotę zrobić coś nieco bardziej deterministyczny. Miej jeden kod odpowiedzialny za wykonanie obu modalnych wyświetlaczy i pozwól mu śledzić, kiedy pierwszy modal pojawia się i znika, tak, że jeśli odbierze wiadomość, aby wyświetlić drugą, to wie, czy to zrobić, czy po prostu ustawić "oczekujące" " flaga. Kiedy zostanie powiedziane, że pierwszy został zwolniony, może sprawdzić, czy drugi jest w toku.

1

Miałem też do czynienia z tego rodzaju problemem. Chciałem wyskoczyć z modalności z push i zanim to zrobię, chciałem sprawdzić, czy jakiś ekran jest już przedstawiony, a jeśli tak, to odrzuć te i pop mój ekran poniżej to kod.

// Dismiss all the modals which are currently shown. 
    - (void) dismissAllModalsIfAnyWithCompletion:(void(^)(BOOL success)) completion{ 

      BOOL hiddenByModal = nil != [[UIApplication sharedApplication].keyWindow.rootViewController presentedViewController]; 
     if (hiddenByModal) { 
//We need to dismiss the existing modal and after completion pop up the new modal. 
      [[UIApplication sharedApplication].keyWindow.rootViewController dismissViewControllerAnimated:NO completion:^{ 
       // After dismissing let the handler know. 
       completion(YES); 
      }]; 
     } 
     else{ 
// If there is no modal, then simply let the handler know to pop the new modal. 
      completion(YES); 
     } 
    } 
+1

Ładne eleganckie rozwiązanie. (Chociaż flaga BOOL wydaje się nieco zbyt skomplikowana, dlaczego nie po prostu zrobić 'if ([[UIApplication sharedApplication] .keyWindow.rootViewController presentedViewController])'?) –

Powiązane problemy