In meiner App verwende ich einen Navigationscontroller. In einigen Ansichten verwende ich später, presentViewController
um ein gezoomtes Bild anzuzeigen . Außerdem benutze ich kein Storyboard oder keine Feder.
Ich erhalte diesen Fehler nur in iOS 7. Es funktioniert gut in iOS 6 und früher:
Es wird davon abgeraten, View Controller auf getrennten View Controllern zu präsentieren
Antworten:
Um zu vermeiden, dass die Warnung in einer Push-Navigation angezeigt wird, können Sie direkt Folgendes verwenden:
Und wenn in Ihrem Modal View Controller alles fertig ist, können Sie einfach anrufen:
[self dismissViewControllerAnimated:YES completion:nil];
quelle
self.navigationController
hat es für mich getan.Der Grund für diese Warnung ist, dass ich einen Ansichts-Controller über einer kleinen Ansicht präsentierte, die keine Ansicht in voller Größe ist. Unten ist das Bild meines Projekts angegeben. Klicken Sie oben auf vier Optionen. Der Benutzer navigiert zu einer anderen Ansicht des untergeordneten Ansichtscontrollers (funktioniert wie der tabViewcontroller). Der Childviewcontroller enthält jedoch eine Ansicht von geringer Größe. Wenn wir also eine Ansicht von childviewcontroller präsentieren, wird diese Warnung ausgegeben.
Um dies zu vermeiden, können Sie eine Ansicht des übergeordneten Elements von childviewcontroller anzeigen
quelle
Warten Sie auf
viewDidAppear()
:Dieser Fehler kann auch auftreten, wenn Sie versuchen, den Ansichts-Controller anzuzeigen, bevor die Ansicht tatsächlich angezeigt wurde, z. B. die Ansicht in
viewWillAppear()
oder früher. Versuchen Sie, danachviewDidAppear()
oder darin eine andere Ansicht darzustellen.quelle
viewDidLoad()
, Leute! Ich habe diesen Fehler so oft gemacht ...In meinem Fall habe ich
sampleViewController
die Ansicht von a als Unteransicht hinzugefügt und dann versucht, ein Popover aus der Ansicht vonsampleViewController
(hierself
stattdessen eineUIViewController
Instanz) darzustellen :Der richtige Weg sollte unten sein:
Übrigens funktioniert dies auch für den Fall, dass ein Popover aus einer Tabellenansichtszelle angezeigt wird. Sie müssen lediglich sicherstellen, dass der Tabellenansichts-Controller auch als untergeordneter Ansichts-Controller hinzugefügt wurde.
quelle
[self addChildViewController:sampleViewController];
, jetzt habe ich dies hinzugefügt, dankeIch denke, das Problem ist, dass Sie keine richtige View-Controller-Hierarchie haben. Stellen Sie den Rootviewcontroller der App ein und zeigen Sie dann neue Ansichten an, indem Sie neue Viewcontroller darauf drücken oder präsentieren. Lassen Sie jeden Ansichts-Controller seine Ansichten verwalten. Nur Container-View-Controller wie der Tabbarviewcontroller sollten jemals andere View-Controller-Ansichten zu ihren eigenen Ansichten hinzufügen. Lesen Sie die Programmieranleitung für View Controller, um mehr über die ordnungsgemäße Verwendung von View Controllern zu erfahren. https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/
quelle
Swift 3
Für alle, die darüber stolpern, ist hier die schnelle Antwort.
quelle
Ich habe fast das gleiche Problem. Der Grund war, dass ich versucht habe, "einige" Controller auf einem anderen zu präsentieren, und nachdem die Animation abgeschlossen war, habe ich den präsentierten Controller als root festgelegt. Nach diesem Vorgang bringen mich alle weiteren Controller zur Warnung: "Das Präsentieren von View-Controllern auf getrennten View-Controllern wird nicht empfohlen. " Und ich löse diese Warnung, indem ich nur "einige" Controller als root ohne Präsentation am Anfang einstelle.
Entfernt:
Machen Sie einfach als Root ohne Präsentation:
quelle
Eine der Lösungen hierfür ist, wenn Sie einen Childviewcontroller haben. Sie präsentieren also einfach den Viewcontroller auf dem übergeordneten Element, indem Sie ihn angeben
Verwenden Sie zum Entlassen denselben Entlassungs-Controller.
Dies ist die perfekte Lösung für mich.
quelle
Verwendung
[self.navigationController presentViewController:xxx animated:YES completion:nil]
in iOS 8.quelle
Versuchen Sie diesen Code
quelle
Versuchen Sie zu präsentieren,
TabBarController
ob es sich um eineTabBarController
basierte App handelt.Grund könnte sein,
self
ist ein Kind vonTabBarController
und Sie versuchen, von einem zu präsentierenChildViewController
.quelle
Ja, ich habe auch dieselbe Warnmeldung erhalten, als ich einen Alert-Controller angezeigt habe, der sich in einer anderen Ansicht befand. Später habe ich dies vermieden, indem ich den Alert-Controller vom übergeordneten View-Controller wie folgt dargestellt habe:
quelle
Sie müssen den Ansichts-Controller hinzufügen, der den neuen Controller als untergeordnetes Element des übergeordneten Ansichts-Controllers darstellt.
Angenommen, Sie haben Ihren MainViewController, fügen dann einen neuen Controller namens controllerA hinzu und möchten dann einen neuen Controller namens controllerB von controllerA präsentieren
du musst so etwas schreiben:
und innerhalb von controllerA können Sie den neuen Controller ohne Warnungen präsentieren
quelle
In Swift 4.1 und Xcode 9.4.1
Die Lösung ist
Wenn ich so schreibe, bekomme ich den gleichen Fehler
Ich erhalte den gleichen Fehler
Komplettlösung ist
quelle
Stellen Sie zunächst sicher, dass Sie über einen Root View Controller verfügen. Sie können es einstellen
didFinishLaunchingWithOptions
.quelle
Viele Gründe für diese Warnung. Meins ist, weil ich einen Übergang von einem ViewController zu einem anderen habe, der modal dargestellt wird. Der ViewController, aus dem ich präsentiere, wird jedoch dynamisch von einem PageViewController generiert. Aus diesem Grund wird es im Storyboard getrennt. Meine App wird deswegen nicht abstürzen. aber ich möchte die Warnung zum Schweigen bringen.
quelle
Ich habe diesen Thread erreicht, in dem ich eine benutzerdefinierte Navigationsleiste habe, und habe über diesen einen AlertViewController aufgerufen.
Ich musste es als Kind meinem Hauptansichts-Controller hinzufügen. Dann könnte ich es ohne Vorwarnung präsentieren.
Sie sollten Ihre
Zoomed Image View Controller
als untergeordnetes Element des Haupt-ViewControllers hinzufügen.(z.B)
Dann können Sie Ihren ZoomedImageViewController aufrufen
quelle
Viele Antworten sind richtig.
Dieses Problem ist mir passiert, als mein Kollege BViewController einen AViewController hinzufügte. Irgendwie fügt er einfach die Ansicht des AViewControllers zur Ansicht des BViewControllers hinzu.
Behoben durch Hinzufügen von bViewController.addChild (aViewController)
quelle
Es hängt davon ab, ob Sie Ihre Warnung oder ähnliches in einem beliebigen UIViewController anzeigen möchten.
Sie können dieses Codebeispiel verwenden:
quelle
Attempt to present <UIAlertController: 0x7fc01a1eb600> on <ViewController: 0x7fc019821e00> whose view is not in the window hierarchy!