10

Jak sprawdzić, czy aktualnie wyświetlany jest kod UIViewController?Jak sprawdzić, czy aktualnie wyświetlany jest kontroler UIViewController?

Moje UIViewControllers nasłuchują NSNotifications - nawet jeśli nie są wyświetlane (tzn. Nie są pokazane). Tak więc mogłem mieć 10 UIViewController w tle, obserwując NSNotifications z. Kiedy NSNotification jest publikowane i odbierane przez UIViewController, chciałbym się dowiedzieć, czy jest on aktualnie wyświetlany. Jeśli tak nie jest, ustawię boolean tak, aby była przetwarzana po wyświetleniu widoku. Jeśli obecnie jest wyświetlany, będę robić więcej rzeczy, takich jak tabele aktualizacji natychmiast, i tak dalej ...

+0

W jaki sposób prezentujesz widok kontrolera widoku? – tdubik

+0

@tdubik: tradycyjny sposób, jak pushViewController. Nie używam StoryBoard lub segues. – ikevin8me

+0

W takim przypadku możesz sprawdzić 'topViewController' z klasy' UINavigationController'. Lub jeśli chcesz przetworzyć więcej niż jeden kontroler wylicza tablicę 'viewControllers'. – tdubik

Odpowiedz

13

Trzeba sprawdzić, czy Twój viewcontroller znajduje się na szczycie stosu kontrolera viewcontroller. Próbkę kodu jest

if (self.navigationController.topViewController == self) { 
    //the view is currently displayed 
} 

Można to wykorzystać wewnątrz metody viewWillAppear, by sprawdzić, czy bieżący widok jest widoczny.

+1

@ Odpowiedź DBD jest bardziej ogólna, a ponieważ tytuł pytania nie jest tak szczegółowy, będzie bardziej przydatny dla przyszłych czytelników. – Zedenem

1

Dlaczego nie usunąć detektor powiadomień w viewWillDisappear i dodać go w viewWillAppear?

Edycja: błędne odczytanie jego pytania, przepraszam.

Sugerowana odpowiedź: ustaw własną flagę (BOOL) w viewDidDisappear i viewDidAppear.

+0

To nie zadziała, ponieważ spowoduje utratę wszystkich powiadomień po usunięciu. – ikevin8me

+0

A co z ustawieniem flagi (BOOL) w widokuWillDisappear, aby wskazać widok jest już niewidoczny. Po otrzymaniu powiadomienia sprawdź flagę, aby zobaczyć, czy widok jest widoczny. – yuf

+0

Jeśli pojawi się powiadomienie, będę musiał ponownie załadować tabelę. Jeśli nie nadejdzie, jest to zbyt kosztowne. Co więcej, nie ma potrzeby ponownego ładowania tabeli, gdy widok ponownie pojawi się z tego samego powodu: dane są takie same i zbyt drogie. – ikevin8me

0

Myślę, że sprawdzanie viewController.view.superview powinno działać.

+0

Nie bardzo rozumiem. Jak dokonać porównania? – ikevin8me

+0

'if (viewController.view.superview! = Nil)' – tdubik

+0

Problem polega na tym, że widok może zostać dołączony do podglądu, ale ten widok może nie być dołączony do twojego okna, więc istnieje potencjalna luka w miejscu, w którym nie będzie działać . – DBD

6

Sprawdź, czy jest przymocowany do okna. Jeśli to nie nil to w hierarchii, która jest przymocowana do ekranu (oczywiście może to być wyłączony granice ekranu pokryta za pośrednictwem innego widoku lub mieć ukrytą flagę)

if (myViewController.view.window) { 
    // I'm attached to the window 
} else { 
    // not attached to the window 
} 
+1

Zamknij, ale powinieneś sprawdzić, czy widok jest załadowany przed sprawdzeniem, czy widok jest w oknie: 'if (self.isViewLoaded && self.view.window! = Nil) ...' –

+0

@rob. Tak, masz rację. Jeśli kontroler podglądu nie jest załadowany i uzyskujesz dostęp do obiektu 'view', spowodujesz leniwy ładowanie, co może oznaczać ładowanie rzeczy do pamięci, które nie są naprawdę gotowe do użycia. Chociaż nadal dałby poprawną odpowiedź, przedstawiałby mniej niż idealną wydajność. Przyjąłem założenie, że powiadomienia będą dodawane tylko wtedy, gdy widok zostanie załadowany, a nie zainicjowany, ponieważ niezainicjowany widok nigdy nie zostanie dołączony. Wciąż było to prawdopodobnie niewłaściwe założenie i takie, które należało podać, jeśli nic innego. – DBD

+0

To naprawdę powinna być prawidłowa odpowiedź, z włączoną zmianą @ robmayoff. – Bill

4

Możesz użyć flagi w metodach viewWillAppear i viewWillDisappear.

1

Określ tytuł dla każdego kontrolera ViewController, a następnie pobierz tytuł bieżącego ViewController za pomocą kodu podanego poniżej.

NSString *currentController = self.navigationController.visibleViewController.title; 

Then check it by your title like this 

if([currentController isEqualToString:@"myViewControllerTitle"]){ 

    //write your code according to View controller. 

} 
Powiązane problemy