Mam kontroler widoku, w którym moja wartość wynosi 0 (etykieta) i kiedy otwieram ten kontroler widoku z innego ViewController
, viewDidAppear
ustawiłem wartość 20 na etykiecie. To działa dobrze, ale gdy zamknę aplikację i niż ponownie otwieram aplikację ale wartość nie zmienia się, ponieważ viewDidLoad
, viewDidAppear
i viewWillAppear
nic się nazywa. Jak mogę zadzwonić po otwarciu mojej aplikacji. Czy muszę coś robić applicationDidBecomeActive
?
175
Odpowiedzi:
Zaciekawiony dokładną sekwencją zdarzeń, przygotowałem aplikację w następujący sposób: (@Zohaib, możesz użyć poniższego kodu NSNotificationCenter, aby odpowiedzieć na swoje pytanie).
Podczas uruchamiania dane wyjściowe wyglądają następująco:
Wprowadź tło, a następnie ponownie wprowadź pierwszy plan:
źródło
Korzystanie z Objective-C
Należy zarejestrować
UIApplicationWillEnterForegroundNotification
wViewController
„sviewDidLoad
metody i kiedy aplikacja wraca z tłem możesz robić, co chcesz robić w metodzie zarejestrowanego dla powiadomienia.ViewController
„s viewWillAppear lub viewDidAppear nie zostanie wywołana, gdy aplikacja wraca z tła na pierwszy plan.Nie zapomnij wyrejestrować powiadomienia, dla którego jesteś zarejestrowany.
Uwaga Po zgłoszeniu
viewController
naUIApplicationDidBecomeActiveNotification
czym metoda będzie wywoływana za każdym razem, gdy aplikacja staje się aktywna, nie zaleca się zarejestrowaćviewController
do tego zgłoszenia.Korzystanie ze Swift
Aby dodać obserwatora, możesz użyć następującego kodu
Aby usunąć obserwatora, możesz użyć funkcji deinit of swift.
źródło
Wersja Swift 3.0 ++
W swoim
viewDidLoad
, zarejestruj się w centrum powiadomień, aby słuchać tego otwartego z działania w tleNastępnie dodaj tę funkcję i wykonaj wymaganą akcję
Na koniec dodaj tę funkcję, aby wyczyścić obserwatora powiadomień, gdy kontroler widoku zostanie zniszczony.
źródło
Swift 4.2. wersja
Zarejestruj się w NotificationCenter,
viewDidLoad
aby otrzymywać powiadomienia o powrocie aplikacji z tłaZaimplementuj metodę, która powinna zostać wywołana.
Możesz usunąć obserwatora, gdy
ViewController
zostanie zniszczony. Jest to wymagane tylko poniżej iOS9 i macOS 10.11źródło
Wystarczy, że kontroler widoku zarejestruje się na
UIApplicationWillEnterForegroundNotification
powiadomienie i zareaguje odpowiednio.źródło
viewDidLoad
sugerowanym przez Ciebie @nsgulliver. TwojeviewDidAppear
wezwanie również,doYourStuff
aby ustawić etykietę z żądaną wartością.Myślę, że rejestracja w UIApplicationWillEnterForegroundNotification jest ryzykowna, ponieważ możesz skończyć z więcej niż jednym kontrolerem reagującym na to powiadomienie. Nic nie gwarantuje, że te kontrolery są nadal widoczne po otrzymaniu powiadomienia.
Oto, co robię: wymuszam wywołanie viewDidAppear na aktywnym kontrolerze bezpośrednio z metody didBecomeActive delegata aplikacji:
Dodaj poniższy kod do
- (void)applicationDidBecomeActive:(UIApplication *)application
źródło
spróbuj dodać to w AppDelegate applicationWillEnterForeground.
źródło
Zgodnie z dokumentacją Apple:
Opis:
informuje kontroler podrzędny, że jego wygląd ma się zmienić. Jeśli wdrażasz niestandardowy kontroler kontenera, użyj tej metody, aby poinformować dziecko, że jego widoki wkrótce się pojawią lub znikną . Nie wywoływać
viewWillAppear:
,viewWillDisappear:
,viewDidAppear:
, lubviewDidDisappear:
bezpośrednio .Opis:
Informuje kontroler podrzędny, że jego wygląd się zmienił. Jeśli implementujesz niestandardowy kontroler kontenera, użyj tej metody, aby poinformować dziecko, że przejście widoku zostało zakończone.
Przykładowy kod:
Pytanie: Jak to naprawiłem?
Odp : Znalazłem ten fragment linii w aplikacji. Te linie sprawiły, że moja aplikacja nie otrzymywała żadnych powiadomień ViewWillAppear. Kiedy skomentowałem te linie, działa dobrze .
źródło