web-dev-qa-db-de.com

PresentViewController kann nicht zum Laufen gebracht werden

Ich habe eine funktionierende Viewcontroller-Klasse aus einem anderen Projekt in ein neues Projekt kopiert. Ich kann die Ansicht nicht in das neue Projekt laden. Im alten Projekt habe ich presentModalViewController verwendet. Im neuen kann ich die Ansicht nicht mit presentModalViewController oder presentViewController laden

Ich versuche, die Ansicht von meinem Main View Controller aus zu laden. 

So sieht meine Hauptansicht-Controller-Schnittstelle aus ...

//  ViewController.h
#import <UIKit/UIKit.h>
#import "RequestDialogViewController.h"

@interface ViewController : UIViewController <RequestDialogViewControllerDelegate> {

}

- (void)requestDialogViewDidDismiss:(RequestDialogViewController *)controller withResponse:(NSString*)response;

Ich verwende presentModalViewController so ...

RequestDialogViewController *requestIPViewController = [[RequestDialogViewController alloc] initWithNibName:@"RequestDialogViewController"  bundle:nil];
navigationController = [[UINavigationController alloc] initWithRootViewController:requestIPViewController];
[self presentModalViewController:navigationController animated:YES];

und presentViewController so ...

RequestDialogViewController *requestIPViewController = [[RequestDialogViewController alloc] initWithNibName:@"RequestDialogViewController"  bundle:nil];    
[self presentViewController:requestIPViewController animated:YES completion:nil];

Was fehlt mir im neuen Projekt? Die init-Methode wird ausgelöst, viewDidLoad jedoch nicht und es wird nichts angezeigt.

Vielen Dank

34
user278859

Wenn ViewController der Root-View-Controller ist, kann er keinen modalen View-Controller innerhalb seiner eigenen viewDidLoad anzeigen, da er zu diesem Zeitpunkt keine Informationen wie die Bildschirmgröße hat.

Wenn bereits andere View-Controller angezeigt wurden, funktioniert dies. Wenn der Root-View-Controller eine UINavigationController ist, sehen Sie eine Ansicht von rechts, während die modale Ansicht von unten nach oben verschoben wird.

Wie auch immer, für Ihre ViewController ist es am frühesten, dass Sie sie präsentieren können, nachdem sie sichtbar geworden ist. Die Verwendung eines Timers ist unzuverlässig. ältere und langsamere Geräte haben deutlich längere Ladezeiten. 

Um mehr Zuverlässigkeit zu gewährleisten, implementieren Sie viewDidAppear: für ViewController. Verwenden Sie Ihr Timersystem dennoch, um eine zusätzliche Verzögerung hinzuzufügen. ein Bruchteil einer Sekunde sollte ausreichen. Obwohl die Darstellung des Modal-View-Controllers aus viewDidAppear für mich im iOS 5.1-Simulator funktioniert hat, Das Präsentieren eines Modal-View-Controllers beim Laden eines anderen ViewControllers besagt, dass dies manchmal nicht geschieht.

82
Dondragmer

Ich habe es gelöst. Ich habe versucht, die Ansicht aus Sicht des Main View Controllers zu präsentieren. Nicht sicher, warum es dort nicht funktioniert, aber stattdessen setze ich einen Timer, der eine Methode zum Anzeigen des View-Controllers aufruft, nachdem die Hauptansicht geladen wurde.

[self presentViewController:requestIPViewController animated:YES completion:nil]; 

Danke an alle, die geantwortet haben.

4
user278859

Wie @Dondragmer sagte, wenn Sie Ihren viewController in viewDidLoad der Root-Ansicht präsentieren möchten, schlägt dies fehl. Sobald Ihr viewController bereit ist, können Sie Ihren neuen viewController präsentieren 

- (void)viewDidLayoutSubviews {
    //present here
}
3
SeanChense

Ich bin auf das gleiche Problem gestoßen. Meine Situation ist jedoch, dass die presentViewController nach der dismissViewControllerAnimated für einen anderen ViewController aufgerufen wird. Meine Lösung ist, den presentViewController zum Fertigstellungsblock von dismissViewControllerAnimated zu verschieben.

0
Bagusflyer