在这段代码中:
NSArray *supportedOrientations = nil;
if( iPhone ) { // bool
supportedOrientations = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UISupportedInterfaceOrientations"];
// one array element
}
else if( iPad ) { // bool
supportedOrientations = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UISupportedInterfaceOrientations~ipad"];
// returns nil
}
else {
NSLog(@"%@:%@ device type not identified", kClassName, kMethodName);
}
如果设备是iPhone,supportOrientations有阵列。
如果是iPad,supportOrientations为零。
始终找到该文件,因此NSLog永远不会显示(通过调试器逐步确认)。
通过文本编辑检查plist时,我看到:
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
关于为什么会发生这种情况的任何想法?
在iOS模拟器4.3版中运行。
答案 0 :(得分:11)
当一个包加载其infoDictionary
时,它会检查字典中的每个键。如果密钥是特定于设备的,则捆绑包将检查密钥是否指向当前设备。
如果密钥引用当前设备,则捆绑包将删除密钥的设备特定部分。例如,在iPad上,捆绑包会将UISupportedInterfaceOrientations~iPad
更改为UISupportedInterfaceOrientations
。
如果密钥引用其他设备,则捆绑包将从字典中删除密钥。例如,在iPhone上,捆绑包会从字典中删除UISupportedInterfaceOrientations~iPad
密钥。
所以你可以这样做:
NSArray *supportedOrientations = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UISupportedInterfaceOrientations"];
这将在所有设备上做正确的事情。
你可以这样做而且它有点短:
NSArray *supportedOrientations = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UISupportedInterfaceOrientations"];