Jak w kodzie kontrolera widoku mogę rozróżnić:
- prezentowane modalnie
- na stosie nawigacyjnym
Obie presentingViewController
i isMovingToParentViewController
są YES
w obu przypadkach, więc nie są zbyt pomocne.
To, co komplikuje sprawę, to fakt, że mój nadrzędny kontroler widoku jest czasami modalny, na który wpychany jest kontroler widoku do sprawdzenia.
Okazuje się, że moim problemem jest to, że osadzam mój HtmlViewController
plik, UINavigationController
który jest następnie prezentowany. Dlatego moje własne próby i poniższe dobre odpowiedzi nie działały.
HtmlViewController* termsViewController = [[HtmlViewController alloc] initWithDictionary:dictionary];
UINavigationController* modalViewController;
modalViewController = [[UINavigationController alloc] initWithRootViewController:termsViewController];
modalViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:modalViewController
animated:YES
completion:nil];
Wydaje mi się, że lepiej byłoby powiedzieć mojemu kontrolerowi widoku, kiedy jest modalny, zamiast próbować określić.
ios
objective-c
swift
uiviewcontroller
uinavigationcontroller
znaczenie ma znaczenie
źródło
źródło
presentingViewController
jest zawszeYES
w moim przypadku; nie pomaga.presentingViewController
zwracaYES
dla wypchniętego VC, gdy istniejeUITabBarController
byt ustawiony jako root. Więc nie pasuje w moim przypadku.W Swift :
Dodaj flagę, aby sprawdzić, czy jest modalna według typu klasy:
źródło
var isModal: Bool {}
false
parametr wreturn
instrukcji?Państwo pominąć jedną metodę:
isBeingPresented
.isBeingPresented
jest prawdziwe, gdy kontroler widoku jest prezentowany i fałszywy, gdy jest wypychany.źródło
isBeingPresented
jestNO
. Ale teraz widzę powód, osadzam mój kontroler widoku prezentowanego w aUINavigationController
, i to jest ten, który naciskam.p
, a niepo
podczas drukowania wartości pierwotnej.po
służy do drukowania obiektów.isBeingPresented
- ta metoda zwraca wartość YES tylko wtedy, gdy jest wywoływana z wnętrza metod viewWillAppear: i viewDidAppear:.isBeingPresented
,isBeingDismissed
,isMovingFromParentViewController
IisMovingToParentViewController
są ważne tylko wewnątrz 4view[Will|Did][Disa|A]ppear
metod.Swift 5
Oto rozwiązanie, które rozwiązuje problem wspomniany w poprzednich odpowiedziach, kiedy
isModal()
zwraca,true
jeśli pushUIViewController
jest w prezentowanymUINavigationController
stosie.Jak na razie to działa. Jeśli jakieś optymalizacje, udostępnij.
źródło
tabBarController?.presentingViewController is UITabBarController
? Czy to ma znaczenie, jeślipresentingViewController
jest to również UITabBarController?isModal
zwrócitrue
. Czy to jest zamierzone?Aby obsłużyć przypadek, w którym bieżący kontroler widoku jest wypychany, podczas gdy kontroler nawigacji jest prezentowany modalnie, dodałem kilka wierszy kodu, aby sprawdzić, czy bieżący kontroler widoku jest kontrolerem głównym w stosie nawigacji.
źródło
Szybki 4
źródło
Swift 5. Czysty i prosty.
źródło
Jak wielu ludzi tutaj sugeruje, że metody „sprawdzania” nie działają dobrze we wszystkich przypadkach, w moim projekcie wymyśliłem rozwiązanie umożliwiające ręczne zarządzanie. Chodzi o to, że zwykle zarządzamy prezentacją samodzielnie - to nie jest to, co dzieje się za kulisami i musimy introspekować.
DEViewController.h
plik:Prezentacje można teraz zarządzać w ten sposób:
na stosie nawigacyjnym:
prezentowane modalnie z nawigacją:
przedstawione modalnie:
Również w
DEViewController
moglibyśmy dodać funkcję powrotu do „sprawdzenia” czy wspomniana nieruchomość jest równaSSViewControllerPresentationMethodUnspecified
:źródło
Zakładając, że wszystkie viewControllery, które prezentujesz modalnie, są opakowane w nowy navigationController (co i tak zawsze powinieneś robić), możesz dodać tę właściwość do swojego VC.
źródło
Aby wykryć, że kontroler jest wciśnięty lub nie wystarczy użyć poniższego kodu w dowolnym miejscu:
Mam nadzieję, że ten kod może pomóc każdemu ...
źródło
self.navigationController != nil
oznaczałoby, że jest w stosie nawigacyjnym.źródło
źródło
Swift 5
To poręczne rozszerzenie obsługuje kilka przypadków więcej niż poprzednie odpowiedzi. Te przypadki to VC (kontroler widoku), który jest głównym VC okna aplikacji, VC jest dodawany jako dziecko do nadrzędnego VC. Próbuje zwrócić prawdę tylko wtedy, gdy kontroler widoku jest przedstawiony modalnie.
Dzięki odpowiedzi Jonauza . Znowu jest miejsce na więcej optymalizacji. Prosimy o omówienie sprawy, którą należy załatwić w sekcji komentarzy.
źródło
Jeśli używasz ios 5.0 lub nowszego, użyj tego kodu
źródło
Dla kogoś, kto się zastanawia, jak powiedzieć ViewController, że jest prezentowany
jeśli
A
prezentuje / pchaB
Zdefiniuj
enum
iproperty
wB
Teraz w
A
widoku kontrolera powiedz,B
czy jest prezentowany / popychany, przypisującpresentationStyle
Użycie w
B
kontrolerze widokuźródło
Dzięki temu wiesz, czy viewController jest prezentowany czy wypychany
źródło