2012-01-03 15 views
19

Sto tentando di convertire la mia applicazione solo iPhone in un'applicazione universale. Ho acceso i dispositivi su Universal e ho fatto in modo che Xcode facesse un MainWindow-iPad.xib per me, e ora quando eseguo l'app nel simulatore iPhone funziona perfettamente, ma quando lo eseguo nel simulatore iPad ottengo un bianco schermo e l'errore Application windows are expected to have a root view controller at the end of application launch. Ho letto altri post su questo stesso problema ma nessuno di questi è limitato a un solo dispositivo."Le finestre dell'applicazione dovrebbero avere un controller di visualizzazione root al termine dell'avvio dell'applicazione", errore solo su iPad

Ecco il mio metodo application:didFinishLaunchWithOptions::

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

/* some dropbox setup stuff */ 


// INIT VIEW AND CORE DATA 
RootViewController *rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil]; 

NSManagedObjectContext *context = [self managedObjectContext]; 
if (!context) { 
    // Handle the error. 
} 

rootViewController.managedObjectContext = context; 

UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController]; 
self.navigationController = aNavigationController; 

[_window addSubview:[_navigationController view]]; 
[_window makeKeyAndVisible]; 

[rootViewController release]; 
[aNavigationController release]; 

return YES; 
} 

EDIT: Ho solo controller della vista una radice che è dimensionato per iPhone chiamata RootViewController. Ma dovrebbe ancora caricare, non dovrebbe? O se non dovrebbe come posso crearne uno per iPad?

+2

Duplicazioni: http://stackoverflow.com/q/7520971/9530 http://stackoverflow.com/q/12784411/9530 http://stackoverflow.com/q/8190567/9530 http: // stackoverflow. com/q/11515818/9530 http://stackoverflow.com/q/9844626/9530 ed eventualmente più –

risposta

52

modificare la riga seguente:

[_window addSubview:[_navigationController view]]; 

a:

_window.rootViewController = _navigationController; 

o, se avete bisogno di iOS 3 compatibilità:

if ([_window respondsToSelector:@selector(setRootViewController:)]) { 
    _window.rootViewController = _navigationController; 
} else { 
    [_window addSubview:_navigationController.view]; 
} 
+1

grazie, ma questo non ha cambiato nulla. qualche altro suggerimento? –

+1

ha funzionato per me, grazie – davis

+1

Eccellente. Ha funzionato anche per me. Grazie. –

2

È necessario creare un RootViewController con l'XI ter file per iPad, altrimenti si otterrà questo errore. Di seguito sono riportati i codici modello forniti da Xcode per l'app universale. Se esegui il debug dell'applicazione nel simulatore iPad e punti il ​​debugger per eseguire il controllo di visualizzazione con il file xib di iPhone, visualizzerai l'errore esatto.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
     self.viewController = [[SYKViewController alloc] initWithNibName:@"SYKViewController_iPhone" bundle:nil]; 
    } else { 
     self.viewController = [[SYKViewController alloc] initWithNibName:@"SYKViewController_iPad" bundle:nil]; 
    } 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
2

in iOS 4 e versioni successive, UIWindow ha la proprietà impostabile rootViewController. Questo è il UINavigationController che spinge lo UIViewController visualizzato all'avvio dell'applicazione. In Xcode IB, selezionando Scena iniziale: il controller di visualizzazione iniziale per UINavigationController imposta tutto senza codice richiesto.

0

Ho provato i tuoi suggerimenti ma nessuno di loro ha funzionato per me, mi dispiace. :/Ho finito solo fare la vista manualmente nel codice, senza la creazione di interfacce:

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
    // Setup view for iPad 
} else 
    // Setup view for iPhone and iPod Touch 
} 

che ho pensato che sarebbe stato molto più difficile di quanto realmente fosse.

Si noti che se si utilizza questo metodo è ancora possibile collegare qualsiasi cosa nel generatore di interfacce e solo cambiare il frame degli oggetti in questi blocchi se si avranno gli stessi oggetti su iPhone e iPad.

2

Dal MainWindow-iPad.xib generato, in Interface Builder, aggiungere un oggetto Controller di visualizzazione in IB, nonché un oggetto al di sotto della vista. Per l'oggetto, impostare la sua classe su AppDelegate, per il View Controller, impostare la classe su ViewController (i Identity Inspector) e specificare il nome del pennino in Attributes Inspector. Puoi vedere il MainWindow.nib per il dispositivo dal quale stavi effettuando la conversione per vedere le differenze.

Modifica: Ho dimenticato di menzionare alcuni passaggi importanti. Sarà inoltre necessario impostare la classe Owner del file su "UIApplication" in IB e impostare le uscite di riferimento in modo appropriato per App Delegate e View Controller. Di nuovo, in IB, è più semplice guardare l'ispettore di connessioni per il pennino MainWindow che hai avuto ed emularlo. Se si dispone di un altro pennino specifico per l'iPad, diverso da MainWindow-iPad.nib (ad esempio ViewController-iPad.nib), assicurati di selezionarlo come proprietario del file e puntarlo verso la vista e impostarne la classe in modo appropriato.