iphone - mini - ios versiones
"Se espera que las ventanas de la aplicación tengan un controlador de vista raíz al final del inicio de la aplicación" error solo en el iPad (5)
Estoy tratando de convertir mi aplicación solo para iPhone a una aplicación Universal. Cambié los dispositivos a Universal y dejé que Xcode lo hiciera haciendo un MainWindow-iPad.xib para mí, y ahora cuando ejecuto la aplicación en el simulador de iPhone funciona bien, pero cuando lo ejecuto en el simulador de iPad obtengo un blanco Application windows are expected to have a root view controller at the end of application launch
pantalla y las Application windows are expected to have a root view controller at the end of application launch
la Application windows are expected to have a root view controller at the end of application launch
error de Application windows are expected to have a root view controller at the end of application launch
. He leído algunas otras publicaciones sobre este mismo problema, pero ninguna de ellas se limita a un solo dispositivo.
Aquí está mi application:didFinishLaunchWithOptions:
method:
- (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;
}
EDITAR: Solo tengo un controlador de vista de raíz que está dimensionado para iPhone llamado RootViewController. Pero todavía debería cargar, ¿no? O si no debería, ¿cómo creo uno para iPad?
Cambia la siguiente línea:
[_window addSubview:[_navigationController view]];
a:
_window.rootViewController = _navigationController;
O, si necesitas compatibilidad con iOS 3:
if ([_window respondsToSelector:@selector(setRootViewController:)]) {
_window.rootViewController = _navigationController;
} else {
[_window addSubview:_navigationController.view];
}
Debe crear un RootViewController con el archivo xib para iPad, de lo contrario obtendrá este error. A continuación se muestra el código de plantilla proporcionado por Xcode para la aplicación universal. Si depura la aplicación en el simulador de iPad y apunta al depurador para que ejecute crear el controlador de vista con el archivo xib del iPhone, verá el error exacto.
- (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;
}
Desde el MainWindow-iPad.xib generado, en Interface Builder, agregue un objeto View Controller en IB, así como un Object debajo de View. Para el objeto, establezca su clase en AppDelegate, para View Controller, establezca la clase en ViewController (i el Inspector de identidad) y especifique el nombre de la plumilla en el inspector de atributos. Puede ver MainWindow.nib para el dispositivo desde el que estaba convirtiendo para ver las diferencias.
Edit: Olvidé mencionar algunos pasos importantes. También deberá configurar la clase de propietario del archivo en "UIApplication" en IB, y configurar los puntos de referencia adecuados para el delegado de aplicaciones y el controlador de vista. Nuevamente, en IB, es más fácil mirar el Inspector de conexiones de la punta de MainWindow que tenía y emularlo. Si tiene otra plumilla específica para el iPad, que no sea MainWindow-iPad.nib (es decir, ViewController-iPad.nib), asegúrese de seleccionar el propietario del archivo, señalarlo a la vista y establecer su clase de manera adecuada también.
En iOS 4 y UIWindow
posteriores, UIWindow
tiene la propiedad rootViewController
configurable. Este es el UINavigationController
que empuja el UIViewController
muestra en el inicio de la aplicación. En Xcode IB, seleccionando Escena inicial: Es el controlador de vista inicial para UINavigationController
configura todo sin necesidad de código.
Intenté tus sugerencias, pero ninguna de ellas funcionó para mí, lo siento. : / Terminé haciendo la vista manualmente en código sin el constructor de interfaces:
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
// Setup view for iPad
} else
// Setup view for iPhone and iPod Touch
}
que pensé que sería mucho más difícil de lo que realmente era.
Tenga en cuenta que si utiliza este método, aún puede conectar todo en el constructor de interfaces y simplemente cambiar el marco de los objetos en estos bloques si va a tener los mismos objetos tanto en el iPhone como en el iPad.