wake-up-neo.com

Warnung: Es wird davon abgeraten, View Controller auf separaten View Controllern zu präsentieren

In meiner App verwende ich einen Navigationscontroller. Später verwende ich in einer bestimmten Ansicht presentViewController, um ein vergrößertes Bild anzuzeigen . Außerdem verwende ich kein Storyboard oder eine Feder. 

Diese Fehlermeldung wird nur in iOS 7 angezeigt. Es funktioniert gut in iOS 6 und früher:

Das Darstellen von Ansichtscontrollern auf getrennten Ansichtscontrollern ist entmutigt

162
Gagan Joshi

Eine der Lösungen hierfür ist, wenn Sie über einen Childviewcontroller verfügen. Sie können also einfach den Viewcontroller auf dem übergeordneten Element angeben 

[self.parentViewController presentViewController:viewController animated:YES completion:nil];

Und für die Entlassung verwenden Sie denselben Entlassungscontroller.

[self dismissViewControllerAnimated:YES completion:nil];

Dies ist die perfekte Lösung für mich.

8
Gagan Joshi

Um zu vermeiden, dass die Warnung in einer Push-Navigation angezeigt wird, können Sie direkt Folgendes verwenden:

[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];

Und wenn alles fertig ist, können Sie in Ihrem Modal-View-Controller einfach Folgendes aufrufen: 

[self dismissViewControllerAnimated:YES completion:nil];

197
cdescours

Der Grund für diese Warnung ist, dass ich einen View-Controller mit einer kleinen Ansicht präsentierte, die nicht in voller Größe angezeigt wird. Unten ist das Bild meines Projekts dargestellt. wo auf klicken Sie auf vier Option oben. Der Benutzer navigiert zu einer anderen Ansicht des childviewcontrollers (sie funktioniert wie tabViewcontroller). Der childviewcontroller enthält jedoch eine kleine Ansicht. Wenn wir also eine Ansicht von childviewcontroller präsentieren, wird diese Warnung ausgegeben. 

master detail view

Um dies zu vermeiden, können Sie eine Ansicht des übergeordneten Elements von childviewcontroller anzeigen

  [self.parentViewController presentViewController:viewController animated:YES completion:nil];
59
Gagan Joshi

Warten Sie auf viewDidAppear():

Dieser Fehler kann auch auftreten, wenn Sie versuchen, den Ansichts-Controller vor dem tatsächlichen Anzeigen der Ansicht zu präsentieren, z. B. Darstellung der Ansicht in viewWillAppear() oder früher. Versuchen Sie, eine andere Ansicht nach viewDidAppear() oder in ihr darzustellen.

45
Azaxis

In meinem Fall habe ich eine sampleViewController-Ansicht als Unteransicht hinzugefügt und versucht dann aus der Ansicht von sampleViewController (hier self statt einer UIViewController-Instanz) einen Popover darzustellen:

[self.view addSubview:sampleViewController.view];

Der richtige Weg sollte unten sein:

// make sure the vc has been added as a child view controller as well
[self addChildViewController:sampleViewController];
[self.view addSubview:sampleViewController.view];
[sampleViewController didMoveToParentViewController:self];

B.t.w., dies funktioniert auch für den Fall, dass ein Popover aus einer Tableview-Zelle dargestellt wird. Sie müssen lediglich sicherstellen, dass der Tableview-Controller auch als untergeordneter View-Controller hinzugefügt wurde.

18
Kjuly

Ich denke, das Problem ist, dass Sie keine richtige Ansichtscontrollerhierarchie haben. Stellen Sie den rootviewcontroller der App ein und zeigen Sie dann neue Ansichten an, indem Sie neue Ansichtscontroller darauf drücken oder darstellen. Lassen Sie jeden Ansichtscontroller seine Ansichten verwalten. Nur Container-View-Controller wie der TabbarView-Controller sollten jemals andere View-Controller-Ansichten zu ihren eigenen Ansichten hinzufügen. Lesen Sie die Programmieranleitung für View-Controller, um mehr über die korrekte Verwendung von View-Controllern zu erfahren. https://developer.Apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/

16

Ich habe fast das gleiche Problem. Der Grund war, dass ich versuchte, "einige" Controller auf einem anderen zu präsentieren, und nachdem die Animation abgeschlossen war, stellte ich den Controller als root ein. Nach diesem Vorgang werden alle weiteren Controller angezeigt, die die Warnung anzeigen: " View Controller auf freistehenden View Controllern werden nicht empfohlen " Und ich löse diese Warnung nur durch Einstellungen "irgendein" Controller als root ohne jegliche Präsentation am Anfang.

Entfernt:

[[self rootController] presentViewController:controller animated:YES completion:^{

       [self window].rootViewController = controller;

       [[self window] makeKeyAndVisible];}];

Einfach als root ohne Präsentation erstellen:

 [[self window] setRootViewController:controller];
9
averem

Swift 3

Für jeden, der darüber stolpert, ist hier die schnelle Antwort.

self.parent?.present(viewController, animated: true, completion: nil)
7
Jeremie

Verwenden Sie [self.navigationController presentViewController:xxx animated:YES completion:nil] in iOS 8.

6
Tao Fang

Versuchen Sie diesen Code

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:<your ViewController object>];

[self.view.window.rootViewController presentViewController:navigationController animated:YES completion:nil];
5
Vlad

Ja, ich habe dieselbe Warnmeldung erhalten, während ich einen Alert-Controller in einer anderen Ansicht angezeigt habe. Später habe ich dies vermieden, indem ich den Alert Controller aus dem übergeordneten View Controller wie folgt präsentierte:

[self.parentViewController presentViewController:alertController animated:YES completion:nil];

sie müssen den View-Controller hinzufügen, der den neuen Controller als untergeordnetes Element des übergeordneten View-Controllers darstellt.

Nehmen wir an, Sie haben yourMainViewController, fügen dann einen neuen Controller mit dem Namen ControllerA hinzu und möchten einen neuen Controller mit dem Namen ControllerB von ControllerA präsentieren

du musst so etwas schreiben:

[self addChildViewController:controllerA]; //self is yourMainViewController
[self.view addsubView:controllerA.view]; 

und innerhalb von controllerA können Sie den neuen Controller ohne Warnungen präsentieren

[self presentViewController:controllerB animated:YES completion:nil]; //self is controllerA
3
Chuy47

Versuchen Sie es auf TabBarController zu präsentieren, wenn es sich um eine TabBarController-basierte App handelt. 

[self.tabBarController presentViewController:viewController animated:YES completion:nil];

Grund könnte sein, dass self ein Kind von TabBarController ist und Sie versuchen, eine ChildViewController zu präsentieren.

2

Stellen Sie sicher, dass Sie über einen Root-View-Controller verfügen, mit dem Sie beginnen können. Sie können es in didFinishLaunchingWithOptions einstellen.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    [window setRootViewController:viewController];
}
1
samwize

Viele Gründe für diese Warnung. Meine liegt daran, dass ich einen Segue von einem ViewController zu einem anderen verbunden habe, der modal dargestellt wird. Der ViewController, den ich präsentiere, wird jedoch dynamisch von einem PageViewController generiert. Deshalb wird es im Storyboard getrennt. Meine App wird deshalb nicht abstürzen; aber ich möchte die Warnung zum Schweigen bringen.

1
Lee Probert

Ich habe in diesem Thread eine benutzerdefinierte Navigationsleiste aufgerufen, über die ich einen AlertViewController aufgerufen habe.

Ich musste es als Kind zu meinem Haupt-View-Controller hinzufügen. Dann könnte ich es ohne Vorwarnung präsentieren.

Sie sollten Ihren Zoomed Image View Controller als untergeordnetes Element des ViewControllers hinzufügen.

(z.B)

[self addChildViewController:ZoomedImageViewController];

Dann können Sie Ihren ZoomedImageViewController aufrufen

[self presentViewController:ZoomedImageViewController];
0
Naveed Abbas

In Swift 4.1 und Xcode 9.4.1

Die Lösung ist 

DispatchQueue.main.async(execute: {
    self.present(alert, animated: true)
})

Wenn ich so schreibe, erhalte ich dieselbe Fehlermeldung

let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
    })
alert.addAction(defaultAction)

present(alert, animated: true, completion: nil) 

Ich bekomme den gleichen Fehler

Presenting view controllers on detached view controllers is discouraged <MyAppName.ViewController: 0x7fa95560Z070>.

Komplette Lösung ist 

let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
     })
alert.addAction(defaultAction)
//Made Changes here    
DispatchQueue.main.async(execute: {
    self.present(alert, animated: true)
})
0
iOS

Es hängt davon ab, ob Sie Ihre Warnung oder etwas Ähnliches in einem UIViewController anzeigen möchten.

Sie können dieses Codebeispiel verwenden:

UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Example" preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:nil];

[alert addAction:cancelAction];


[[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:alert animated:true completion:nil];
0
Fabio