Не удается получить поддерживаемый массив ориентаций интерфейса, почему?

В этом блоке кода:

   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.


person TigerCoding    schedule 03.12.2011    source источник


Ответы (1)


Когда пакет загружает свой infoDictionary, он проверяет каждый ключ в словаре. Если ключ специфичен для устройства, пакет проверяет, относится ли ключ к текущему устройству.

  • Если ключ относится к текущему устройству, пакет удаляет специфичную для устройства часть ключа. Например, на iPad набор меняет UISupportedInterfaceOrientations~iPad на UISupportedInterfaceOrientations.

  • Если ключ относится к другому устройству, пакет удаляет ключ из словаря. Например, на iPhone бандл удаляет из словаря ключ UISupportedInterfaceOrientations~iPad.

Итак, вы можете просто сделать это:

NSArray *supportedOrientations = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UISupportedInterfaceOrientations"];

Это будет правильно на всех устройствах.

Вы можете сделать это вместо этого, и это немного короче:

NSArray *supportedOrientations = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UISupportedInterfaceOrientations"];
person rob mayoff    schedule 03.12.2011
comment
Огромное спасибо. Я боролся с этим около 2 часов. - person TigerCoding; 04.12.2011