Czy można sprawdzić wewnątrz klasy ViewController, że jest prezentowany jako kontroler widoku modalnego?
iphone
ios
view
controller
modal-dialog
letni
źródło
źródło
nil == nil
zwracaYES
, a nie jest to wynik, którego chcemy.Jeśli szukasz systemu iOS 6+, ta odpowiedź jest przestarzała i powinieneś sprawdzić odpowiedź Gabriele Petronella
Nie ma na to zgrabnego sposobu, ponieważ jest to właściwość lub metoda natywna dla UIKit. Możesz sprawdzić kilka aspektów swojego kontrolera, aby upewnić się, że jest on przedstawiony jako modalny.
Tak więc, aby sprawdzić, czy obecny (przedstawiony
self
w kodzie poniżej) kontroler jest przedstawiony w sposób modalny, czy nie, mam poniżej funkcję albo wUIViewController
kategorii, albo (jeśli twój projekt nie musi używać innych kontrolerów UIKit, jakUITableViewController
na przykład) w kontrolerze podstawowym, który dziedziczą moje inne kontroleryEDYCJA: Dodałem ostatnie sprawdzenie, czy używany jest UITabBarController, i przedstawiasz inny UITabBarController jako modalny.
EDYCJA 2: dodano kontrolę iOS 5+, gdzie
UIViewController
już nie odpowiadaparentViewController
, alepresentingViewController
zamiast tego.EDYCJA 3: Stworzyłem dla niego sedno na wszelki wypadek https://gist.github.com/3174081
źródło
modalViewController
właściwość jest przestarzała od wersji iOS 6. Dokumentacja sugeruje jej użyciepresentedViewController
.NSLog(@"%@", self.navigationController.parentViewController)
wydruki(null)
- czy mógłbyś wyjaśnić dlaczego? Mój ViewController jest połączony z kontrolerem widoku modalnego poprzez navController w scenorysie..parentViewController
jest przestarzały,.presentingViewController
należy go zamiast tego użyć.W iOS5 +, jak widać w odwołaniu do klasy UIViewController , można je pobrać z właściwości „ presentViewController ”.
PresentViewController Kontroler widoku, który przedstawił ten kontroler widoku. (tylko czytać)
@property (nonatomic, readonly) UIViewController * presentViewController
Discussion
Jeśli kontroler widoku, który odebrał ten komunikat, jest prezentowany przez inny kontroler widoku, ta właściwość zawiera kontroler widoku, który go przedstawia. Jeśli kontroler widoku nie jest prezentowany, ale prezentowany jest jeden z jego przodków, ta właściwość przechowuje kontroler widoku przedstawiający najbliższego przodka. Jeśli nie jest przedstawiony ani kontroler widoku, ani żaden z jego przodków, ta właściwość jest zerowa.
Dostępność
Dostępne w iOS 5.0 i nowszych.
Zadeklarowane w
UIViewController.h
źródło
presentingViewController
. Będzie również działać w kontrolerach widoku kontenera, ponieważ automatycznie przechodzi przez przodków.Jeśli tak nie jest, możesz zdefiniować właściwość this (
presentedAsModal
) w podklasie UIViewController i ustawić ją naYES
przed przedstawieniem ViewController jako widoku modalnego.Możesz sprawdzić tę wartość w swoim
viewWillAppear
nadpisaniu.Uważam, że nie ma oficjalnej właściwości określającej sposób prezentacji widoku, ale nic nie stoi na przeszkodzie, aby utworzyć własny.
źródło
UINavigationController
jako modalne ... chyba że utworzysz niestandardowy kontroler nawigacji tylko po to, aby dodać tę właściwość. A potem, wewnątrz kontrolerów, będziesz musiał przesyłaćself.navigationController
do tej niestandardowej klasy za każdym razem, gdy będziesz musiał sprawdzić, czy kontroler jest prezentowany jako modalnyOdpowiedź Petronelli nie działa, jeśli self.navigationController jest prezentowane modalnie, ale self nie jest równe self.navigationController.viewControllers [0], w tym przypadku self jest wypychane.
Oto, jak możesz rozwiązać problem.
A w Swift:
źródło
To powinno działać.
źródło
UINavigationController
iUITabBarController
. Jak na razie działa całkiem nieźleNajlepszy sposób na sprawdzenie
źródło
Jeśli nie musisz rozróżniać między pełnoekranowymi widokami modalnymi a widokami niemodalnymi, co ma miejsce w moim projekcie (miałem do czynienia z problemem, który występuje tylko w przypadku arkuszy formularzy i arkuszy stron), możesz skorzystać z modalPresentationStyle właściwość UIViewController:
źródło
W Swift :
źródło
W moim projekcie mam kontroler widoku (Szczegóły), który może być prezentowany modalnie (podczas dodawania nowego elementu) lub za pomocą push (podczas edycji istniejącego) przez kontroler widoku Master. Gdy użytkownik naciśnie przycisk [Gotowe], kontroler widoku szczegółowego wywołuje metodę kontrolera widoku głównego, aby powiadomić, że jest gotowy do zamknięcia. Mistrz musi określić, w jaki sposób przedstawiony jest szczegół, aby wiedzieć, jak go zamknąć. Oto jak to robię:
źródło
Taki hack może zadziałać.
Myślę jednak, że moja poprzednia odpowiedź jest czystszym rozwiązaniem.
źródło
To, co dla mnie zadziałało, to:
O ile to przetestowałem, działa to na iOS7 i iOS8. Nie próbowałem jednak na iOS6.
źródło
Rozejrzałem się trochę, aby znaleźć właściwą odpowiedź na to pytanie i nie mogłem znaleźć żadnej, która obejmowałaby wszystkie możliwe scenariusze. Napisałem kilka wierszy kodu, które wydają się działać. Możesz znaleźć kilka komentarzy w tekście, aby dowiedzieć się, co zostało sprawdzone.
Mam nadzieję, że to pomoże.
źródło
Oto moja zmodyfikowana wersja @ GabrielePetronella's
isModal
, która działa z zawartymi kontrolerami widoku, ponieważ najpierw przechodzi w górę hierarchii parentViewController. Wyciągnęliśmy również kod do wielu wierszy, aby było jasne, co robi.źródło