2012-04-13 8 views
27

Ho copiato una classe viewcontroller di lavoro da un altro progetto in un nuovo progetto. Non riesco a ottenere la vista per caricare nel nuovo progetto. Nel vecchio progetto ho usato presentModalViewController. Nel nuovo non riesco a ottenere la vista di caricare utilizzando presentModalViewController o presentViewControllerImpossibile rendere presenteViewController per funzionare

Sto cercando di caricare il presente la vista dal mio controller di visualizzazione principale.

Ecco quello che il mio principale interfaccia di vista del regolatore sembra ...

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

@interface ViewController : UIViewController <RequestDialogViewControllerDelegate> { 

} 

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

Sto usando presentModalViewController come questo ...

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

e presentViewController così ...

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

Cosa mi manca nel nuovo progetto? Il metodo init si attiva, ma viewDidLoad non lo fa e non viene visualizzato nulla.

Grazie

risposta

73

Se ViewController è il controller di visualizzazione radice, non può presentare un controller di visualizzazione modale dal proprio viewDidLoad, perché a quel punto non dispone di informazioni come le dimensioni dello schermo.

Se altri controller di vista sono già visualizzati, funzionerà. Se il controller della vista radice è un UINavigationController, vedrai una vista che scorre da destra mentre la vista modale scorre dal basso verso l'alto.

Ad ogni modo, per il tuo ViewController, il più presto possibile è dopo che è diventato visibile. Usare un timer per questo non è affidabile; dispositivi più vecchi e più lenti hanno tempi di caricamento notevolmente più lunghi.

Per maggiore affidabilità, implementare viewDidAppear: per ViewController. Usa ancora il tuo sistema di timer per aggiungere un ulteriore ritardo; una frazione di secondo dovrebbe essere sufficiente. Anche se presentare il controller della vista modale dall'interno di viewDidAppear ha funzionato per me nel simulatore iOS 5.1, Presenting a modal view controller when loading another ViewController dice che a volte non accade.

+3

Wow, questo era non ovvio per me. Ho passato qualche tempo a cercare di capirlo. Grazie. – rjgonzo

+0

Se ciò accade durante l'avvio dell'app, non c'è ancora uno sfarfallio del controller della vista che presenta prima che venga visualizzato il controller della vista presentato? In qualche modo intorno a questo? Vedi http://stackoverflow.com/questions/14739461/how-do-you-transition-in-a-new-non-model-view-controller-without-using-uinavigat/14739540#14739540 per il contesto. – Marplesoft

+0

Questo è ancora il caso per iOS 10 Xcode 8 Swift 2.3. Grazie! – justColbs

0

Presente un modalViewController:

Per il bene di tutti i programmatori di partenza, tipo invece di copia incolla.

myVC *viewController = [[myVC alloc]initWithNibName:@"myVC" bundle:nil]; 
viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentModalViewController:viewController animated:YES]; 
[viewController release]; 

Sembra che si stava tentando di presentare un controller di navigazione come un controller della vista nel primo campione, allora si stava utilizzando il metodo sbagliato nel secondo.

+0

In realtà lei ha ragione per quanto riguarda la presentModalViewController. Ho copiato male dal mio codice di lavoro. Stavo, comunque, volendo davvero far funzionare il presenteViewController come presentodelModalViewController è stato deprecato. L'ho fatto funzionare ... Vedi la mia risposta qui sotto. – user278859

+2

Per riferimento futuro, non eseguire la copia/incolla della programmazione. –

4

Ho risolto. Stavo cercando di presentare la vista da vista caricata del controller della vista principale. Non certo perché non funziona lì, ma invece ora sto impostando un timer che chiama un metodo per presentare il controller della vista dopo la vista principali carichi e funziona bene ora utilizzando ...

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

grazie a quelle chi ha risposto

+0

Questo metodo è disponibile solo in iOS 6 e oltre –

+4

@NathanielSymer Non penso che sia giusto. I documenti dicono che presentViewController: animato: completamento: è iOS5 e versioni successive. Vedi http://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/presentViewController:animated:completion: – Marplesoft

0

Ho riscontrato lo stesso problema. Ma la mia situazione è che il presentViewController viene chiamato dopo il dismissViewControllerAnimated per un altro ViewController.La mia soluzione è spostare il presentViewController nel blocco di completamento di dismissViewControllerAnimated.

+0

Ha senso. perché devi chiudere un controller prima di presentarne un altro. –

2

Come ha detto @Dondragmer, se si desidera presentare il viewController nella vista radice viewDidLoad, non funzionerà. Una volta che viewController è pronto, è possibile presentare il nuovo viewController. Quindi, si può farlo in

- (void)viewDidLayoutSubviews { 
    //present here 
} 
+1

^dipende da quante volte vuoi presentarlo :) Il punto di rottura del debugger ha mostrato che questo è stato chiamato un paio di volte in rapida successione. –

Problemi correlati