Iphone &引用;在应用程序启动结束时,应用程序窗口应具有根视图控制器;仅在iPad上出错
我正在尝试将我的iPhone专用应用程序转换为通用应用程序。我将设备切换到Universal,让Xcode为我制作一个MainWindow-iPad.xib,现在当我在iPhone模拟器中运行该应用程序时,它工作正常,但当我在iPad模拟器中运行它时,我会看到一个白色屏幕,Iphone &引用;在应用程序启动结束时,应用程序窗口应具有根视图控制器;仅在iPad上出错,iphone,objective-c,uiview,mainwindow,Iphone,Objective C,Uiview,Mainwindow,我正在尝试将我的iPhone专用应用程序转换为通用应用程序。我将设备切换到Universal,让Xcode为我制作一个MainWindow-iPad.xib,现在当我在iPhone模拟器中运行该应用程序时,它工作正常,但当我在iPad模拟器中运行它时,我会看到一个白色屏幕,应用程序窗口预计在应用程序启动结束时会有一个根视图控制器。我读过一些关于这个问题的其他帖子,但没有一篇文章只限于一台设备 这是我的应用程序:didFinishLaunchWithOptions:方法: - (BOOL)appl
应用程序窗口预计在应用程序启动结束时会有一个根视图控制器。我读过一些关于这个问题的其他帖子,但没有一篇文章只限于一台设备
这是我的应用程序: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;
}
编辑:我只有一个根视图控制器,它的大小适合iPhone,名为RootViewController。但它还是应该载入的,不是吗?或者如果不应该,我如何为iPad创建一个呢?更改以下行:
[_window addSubview:[_navigationController view]];
致:
或者,如果您需要iOS 3兼容性:
if ([_window respondsToSelector:@selector(setRootViewController:)]) {
_window.rootViewController = _navigationController;
} else {
[_window addSubview:_navigationController.view];
}
您需要为iPad创建一个带有xib文件的RootViewController,否则会出现此错误。下面是Xcode为universal app提供的模板代码。如果您在iPad模拟器中调试应用程序,并将调试器指向运行“使用iPhone xib文件创建视图控制器”,您将看到确切的错误
- (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;
}
在iOS 4及更高版本中,UIWindow
具有可设置的属性rootViewController
。这是推送应用程序启动时显示的UIViewController
的UINavigationController
。在Xcode IB中,为UINavigationController
选择初始场景:是初始视图控制器将设置一切,而不需要任何代码。我尝试了你的建议,但没有一个对我有效,抱歉。:/我最终只是在没有界面生成器的代码中手动创建视图:
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
// Setup view for iPad
} else
// Setup view for iPhone and iPod Touch
}
我认为这比实际情况要困难得多
请注意,如果您使用此方法,您仍然可以在interface builder中连接所有内容,如果您希望在iPhone和iPad上都有相同的对象,则只需更改这些块中的对象帧。在interface builder中生成的MainWindow-iPad.xib中,在IB中添加视图控制器对象,以及视图下方的对象。对于对象,将其类设置为AppDelegate;对于视图控制器,将类设置为ViewController(i标识检查器),并在属性检查器中指定nib名称。您可以查看正在转换的设备的MainWindow.nib以查看差异
编辑:我忘了提到一些重要的步骤。您还需要在IB中将文件的所有者类设置为“UIApplication”,并为应用程序委托和视图控制器适当地设置引用出口。同样,在IB中,最简单的方法是查看主窗口nib的连接检查器并对其进行仿真。如果您有另一个特定于iPad的nib,而不是MainWindow-iPad.nib(即ViewController-iPad.nib),请确保选择其文件的所有者,并将其指向视图,并适当设置其类别。谢谢,但这不会改变任何事情。还有其他建议吗?太好了。也为我工作。谢谢。傻瓜:还有可能更多
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
// Setup view for iPad
} else
// Setup view for iPhone and iPod Touch
}