W mojej aplikacji korzystam z kontrolera nawigacyjnego. Później w pewnym widoku używam presentViewController
do wyświetlania powiększonego obrazu. Nie używam również Storyboard ani stalówki.
Ten błąd pojawia się tylko w systemie iOS 7. Działa dobrze w iOS 6 i wcześniejszych:
Prezentowanie kontrolerów widoku na odłączonych kontrolerach widoku jest odradzane
Odpowiedzi:
Aby uniknąć ostrzeżenia w nawigacji push, możesz bezpośrednio użyć:
A potem w twoim modalnym kontrolerze widoku, kiedy wszystko jest skończone, możesz po prostu wywołać:
[self dismissViewControllerAnimated:YES completion:nil];
źródło
self.navigationController
zrobił to dla mnie.Powodem tego ostrzeżenia jest to, że przedstawiałem kontroler widoku w małym widoku, który nie jest widokiem w pełnym rozmiarze. Poniżej znajduje się obraz mojego projektu. gdzie po kliknięciu na cztery opcje powyżej. Użytkownik nawiguje do innego widoku kontrolera dzieci (działa jak tabViewcontroller). Ale kontroler widoku dziecka zawiera widok małego rozmiaru. Więc jeśli przedstawimy widok z kontrolera podglądu dziecka, wyświetli to ostrzeżenie.
Aby tego uniknąć, możesz przedstawić pogląd na rodzica kontrolującego dziecko
źródło
Poczekaj na
viewDidAppear()
:Ten błąd może również wystąpić, jeśli próbujesz przedstawić kontroler widoku, zanim widok faktycznie się pojawił, na przykład prezentując widok w
viewWillAppear()
lub wcześniej. Spróbuj przedstawić inny widok po nimviewDidAppear()
lub wewnątrz niego.źródło
viewDidLoad()
, ludzie! Popełniłem ten błąd wiele razy ...W moim przypadku mam
sampleViewController
widok dodany jako widok podrzędny, a następnie próbuję przedstawić popover z widokusampleViewController
(tutajself
zamiastUIViewController
instancji):Właściwa droga powinna być poniżej:
Btw, działa to również w przypadku, który przedstawia popover z komórki widoku tabeli, wystarczy upewnić się, że kontroler widoku tabeli został również dodany jako kontroler widoku potomnego.
źródło
[self addChildViewController:sampleViewController];
dodałem, teraz dodałem to, dziękujęMyślę, że problem polega na tym, że nie masz odpowiedniej hierarchii kontrolera widoku. Ustaw kontroler rootview aplikacji, a następnie pokaż nowe widoki, wypychając lub prezentując na nich nowe kontrolery widoków. Pozwól każdemu kontrolerowi widoku zarządzać swoimi widokami. Tylko kontrolery widoków kontenerów, takie jak kontroler tabbarview, powinny dodawać widoki innych kontrolerów widoków do swoich własnych widoków. Przeczytaj przewodnik programowania kontrolerów widoku, aby dowiedzieć się więcej na temat prawidłowego korzystania z kontrolerów widoku. https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/
źródło
Szybki 3
Dla każdego, kto się na to natknie, oto szybka odpowiedź.
źródło
Mam prawie ten sam problem. Powodem było to, że próbowałem przedstawić „jakiś” kontroler na innym, a po zakończeniu animacji ustawiałem prezentowany kontroler jako root. Po tej operacji wszystkie kolejne kontrolery prezentujące przynoszą mi ostrzeżenie: „Nie zaleca się prezentowania kontrolerów widoku na odłączonych kontrolerach widoku ”. I rozwiązuję to ostrzeżenie, ustawiając „niektóre” kontrolery jako root bez żadnej prezentacji na początku.
Oddalony:
Po prostu zrób jako root bez żadnej prezentacji:
źródło
Jednym z rozwiązań tego problemu jest posiadanie kontrolera podglądu dziecka. Po prostu prezentujesz kontroler podglądu na jego rodzicu przez dany
Do zwolnienia użyj tego samego kontrolera odrzucania.
To idealne rozwiązanie działa dla mnie.
źródło
Użyj
[self.navigationController presentViewController:xxx animated:YES completion:nil]
w iOS 8.źródło
Wypróbuj ten kod
źródło
Spróbuj przedstawić,
TabBarController
jeśli jest toTabBarController
aplikacja oparta.Przyczyną może być
self
dziecko,TabBarController
a ty próbujesz przedstawić coś odChildViewController
.źródło
Tak, napotkałem również ten sam komunikat ostrzegawczy podczas wyświetlania kontrolera alertów, który był w innym widoku. Później uniknąłem tego, prezentując kontroler alertów z kontrolera widoku nadrzędnego, jak poniżej:
źródło
musisz dodać kontroler widoku, który będzie prezentował nowy kontroler jako dziecko nadrzędnego kontrolera widoku.
Załóżmy, że masz swój główny kontroler, a następnie dodajesz nowy kontroler o nazwie kontroler A, a następnie chcesz przedstawić nowy kontroler o nazwie kontroler B z kontrolera A
musisz napisać coś takiego:
oraz w kontrolerze A możesz przedstawić nowego kontrolera bez ostrzeżeń
źródło
W Swift 4.1 i Xcode 9.4.1
Rozwiązaniem jest
Jeśli piszesz w ten sposób, otrzymuję ten sam błąd
Otrzymuję ten sam błąd
Kompletne rozwiązanie to
źródło
Upewnij się, że masz kontroler widoku głównego na początek. Możesz to ustawić
didFinishLaunchingWithOptions
.źródło
Wiele powodów tego ostrzeżenia. Mój jest, ponieważ mam segment połączony z ViewController do innego, który będzie prezentowany modalnie. Ale ViewController, z którego prezentuję, jest generowany dynamicznie przez PageViewController. Dlatego jest odłączony w serii ujęć. Moja aplikacja nie ulegnie awarii z tego powodu; ale chciałbym uciszyć ostrzeżenie.
źródło
Dotarłem do tego wątku, w którym mam niestandardowy pasek nawigacji i przez niego dzwoniłem do AlertViewController.
Musiałem dodać go jako dziecko do mojego głównego kontrolera widoku. Wtedy mógłbym zadzwonić, przedstawić to bez żadnego ostrzeżenia.
Powinieneś dodać swoją
Zoomed Image View Controller
jako dziecko głównego ViewController.(na przykład)
Wtedy możesz zadzwonić do swojego ZoomedImageViewController
źródło
Wiele odpowiedzi jest poprawnych.
Ten problem przytrafił mi się, gdy mój współpracownik dodał AViewController do BViewController. W jakiś sposób po prostu dodał widok AViewController do widoku BViewController.
Naprawiono przez dodanie bViewController.addChild (aViewController)
źródło
To zależy, czy chcesz pokazać swój alert lub coś podobnego w jakimkolwiek rodzaju UIViewController.
Możesz użyć tego przykładu kodu:
źródło
Attempt to present <UIAlertController: 0x7fc01a1eb600> on <ViewController: 0x7fc019821e00> whose view is not in the window hierarchy!