webentwicklung-frage-antwort-db.com.de

iOS 7 - Erhalten einer Warnmeldung beim Präsentieren des Modal-View-Controllers

Kompilieren und Ausführen mit iOS 7 - Ich erhalte eine Warnmeldung: "Es wird abgeraten, View Controller auf separaten View Controller zu präsentieren", während der modale View Controller präsentiert wird. Ich hatte nie Probleme mit iOS 6 oder einer früheren Version. Kann jemand zeigen, ob sich bei der Präsentation des Modal View Controllers etwas geändert hat?

SearchViewController *controller1;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    controller1 = [[SearchViewController alloc] initWithNibName:@"SearchViewController-iPad" bundle:nil];
}
else
{
   controller1 = [[SearchViewController alloc] initWithNibName:@"SearchViewController" bundle:nil];
}
controller1.delegate = self;
[[self navigationController] presentModalViewController:controller1 animated:YES];

* EDIT * Hier ist der Code Kann jemand darauf hinweisen, wo er verschachtelt ist .. Sieht aus, als wären sie verschachtelt.

(void)applicationDidFinishLaunching:(UIApplication *)application
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        self.loginRootviewController =   [[MainViewController alloc] initWithNibName:@"MainViewController-iPad" bundle:nil];
    }
    else
    {
       self.loginRootviewController =   [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
    }

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.loginRootviewController];


    DDMenuController *rootController = [[DDMenuController alloc] initWithRootViewController:navController];
    _menuController = rootController;



    AppMainMenuViewController *leftController = [[AppMainMenuViewController alloc] init];
    rootController.leftViewController = leftController;
    self.loginRootviewController.delegateLogin = leftController;

    self.window.rootViewController = rootController;

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

}
23
Ram G.

Ein View Controller wird getrennt, wenn dem Storyboard keine Segmente bekannt sind, die diesen View Controller auf irgendeine Weise mit dem Root View Controller verbinden.

Es wird empfohlen, dass Sie einen Schnitt mit dem Interface Builder erstellen und ihn auch für eine modale Ansicht im Code aufrufen, wenn Sie ein Storyboard verwenden.

Selbst mit XCode 4.6.x und iOS 6.x wurden beim Build Warnhinweise zu nicht verbundenen View-Controllern angezeigt.

Wenn Sie über zwei Storyboards verfügen (eines für iPhone und eines für iPad), können Sie den Segmenten jeweils einen Namen geben. Segue-IDs müssen nur pro Storyboard eindeutig sein. Wenn Sie also einen Abschnitt ( performSegueWithIdentifier ) mit derselben Kennung ausführen, können Sie zu einer Stelle auf dem iPhone und zu einer anderen auf dem iPad gelangen.

18
Marcus Adams

Diese Warnung tritt normalerweise auf, wenn wir versuchen, einen Ansichts-Controller in einem anderen Ansichts-Controller, der nicht Teil von rootViewController ist, modal darzustellen, und der Ansicht des Ansichts-Controllers nurSubview hinzufügen. 

In diesem Stadium sollten wir presentViewController in diesem View-Controller aufrufen, der Teil von rootViewController ist.

So können wir jeden Ansichts-Controller direkt in rootViewController präsentieren

UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
[vc presentViewController:obj animated:YES completion:nil];
[vc dismissViewControllerAnimated:YES completion:nil];
18
Teena nath Paul

Ich hatte das gleiche Problem und auch ich verwendete kein Storyboard (ich arbeite an einem drei Jahre alten Projekt).

In meinem Fall bestand die Ursache darin, dass ich den rootViewController meiner Anwendung nicht wie folgt dem Fenster zugewiesen habe:

- (BOOL)application:didFinishLaunchingWithOptions:
{
    ...
    self.window.rootViewController = myRootViewController; // I was missing this
    ...
}

Keine weiteren Warnungen mehr.

18
Riccardo Tesio

Für diejenigen, die DDMenuViewController verwenden, ist dies eine einfache Lösung. Fügen Sie einfach [self addChildViewController:controller]; zu initWithRootViewController und zu setRightViewController und setLeftViewController hinzu.

7
bmueller

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];

4
cdescours

Wenn Sie das Storyboard verwenden und diese Fehlermeldung angezeigt wird, kann dies passieren, wenn Sie versuchen, eine Ansicht von viewDidLoad zu schnell automatisch anzuzeigen. Wenn Sie Ihr modales Segment nach kurzer Zeit aufrufen, funktioniert es ohne weitere Warnungen.

2
AndyDunn

Diese Meldung kann immer noch angezeigt werden, wenn Sie Viewcontroller verschachtelt haben ..__ Wenn dies der Fall ist, stellen Sie sicher, dass sie mit dem untergeordneten Viewcontroller-Muster verknüpft sind.

2
berbie

Aufruf von [self presentViewController: vc animated: NO Vervollständigung: nil]; in viewDidAppear hat das Problem für mich behoben.

1
oyvindhauge

Ich habe festgestellt, dass Sie, wenn Sie ein Storyboard verwenden, den Code, der den neuen View-Controller darstellt, in viewDidAppear einfügen möchten. Dadurch wird auch die Warnung "Unbalanced Calls zu Beginn/Ende der Erscheinungsübergänge für ..." entfernt.

0
Dan Levy

Ich hatte das gleiche Problem. Aber nicht so, wie ich die Ansicht gestartet habe, sondern wie sie konfiguriert wurde. Ich hatte die Klasse in der Ansicht versehentlich auf die View-Controller-Klasse anstatt auf den Dateieigner festgelegt. Der Hinweis war, dass die Ansicht angezeigt wurde, aber ein Teil des Stylings fehlte. Das Seltsame ist, dass es mit älteren Versionen von iOS funktionierte.

0
Clive Jefferies