我需要以编程方式加载故事板,在iOS7中,以下代码有效:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // need to comment out in iOS8
self.window.backgroundColor = [UIColor cyanColor];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
self.window.rootViewController = [storyboard instantiateInitialViewController];
[self.window makeKeyAndVisible];
return YES;
}
但是在iOS8(XCode 6.1)中,上面的代码没有正确自动旋转:
和
我需要注释self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
以更正自动轮换。
知道第一行有什么不同吗?
答案 0 :(得分:1)
好吧,我从developer forum找到答案。只需从应用程序的信息属性列表中删除UIMainStoryboardFile密钥。
"您的应用程序的信息属性列表包含UIMainStoryboardFile键,但您也手动创建了一个UIWindow,其中包含在您的应用程序委托中手动加载的故事板。
当信息属性列表中存在UIMainStoryboardFile键时,系统会在调用您的应用程序委托之前,使用与故障板中的UIMainStoryboardFile键值对应的初始视图控制器创建UIWindow对象。然后,您的应用委托会重复此过程,根据屏幕大小确定要加载的故事板,并使用故事板中的初始视图控制器创建另一个UIWindow。 由系统创建的窗口(作为第一窗口)首先接收方向改变通知。由于iOS 8.1中的更改,第一个窗口最终会阻止第二个窗口(您创建的窗口,关键窗口)响应方向更改。根据我所看到的情况,只有在未加载第一个Windows rootViewController视图时才会发生这种情况(原始窗口永远不可见)。我用工程方法澄清了细节,并将自己记录任何需要的错误报告。
您应用的解决方案是从应用的信息属性列表中删除UIMainStoryboardFile和UIMainStoryboardFile~ipad键。"