проверка iPhone на константу во времени выполнения в универсальном приложении

Я делаю универсальный iPad/приложение для iPhone, который может использовать VGA iPad коннектор для зеркального отражения содержания приложения на внешнем экране. Однако iPhone не имеет этой функциональности. учитывая следующий код,

#ifdef UI_USER_INTERFACE_IDIOM  
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    NSLog(@"this code should not execute on iphone");
[[NSNotificationCenter defaultCenter] addObserver:self
         selector:@selector(screenInfoNotificationReceieved:) 
          name:UIScreenDidConnectNotification
           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
         selector:@selector(screenInfoNotificationReceieved:) 
          name:UIScreenDidDisconnectNotification
           object:nil];
}
#endif

Я добираюсь, эта ошибка по телефону в запуске (хорошо работает в iPad), "dyld: Символ, не найденный: _UIScreenDidConnectNotification"

по-видимому, потому что UIScreenDidConnectNotification does не' существует все же в 3,13. Как я проверяю на это во времени выполнения?

ОБНОВЛЕННЫЙ добавил ifdef операторы для проверки на интерфейс iPad, но получение того же результата!

ОБНОВЛЕННЫЙ добавил оператор NSLog для проверки кода в, если оператор не называют. Катастрофический отказ, кажется, происходит, прежде чем любой другой код выполнен...

5
задан joshue 28 April 2010 в 12:53
поделиться

3 ответа

Попробуйте использовать UIKit для слабого звена. Добавьте в другие флаги ссылки:

-all_load -ObjC -weak_framework UIKit

Если вы нацеливаетесь на устройства до 3.1, но ссылаетесь на класс, который существует только в 3.2, вы не можете ссылаться на них по символу, у вас есть использовать NSClassFromString. Но есть случаи, когда это невозможно, например если вы подклассифицируете такой класс (скажем, UIPopoverController). В этих случаях вам нужно сделать слабую ссылку на UIKit. Когда вы устанавливаете слабую связь с фреймворком, динамический загрузчик пытается разрешить все символы при запуске, в случае сбоя он устанавливается в NULL.

Я предполагаю, что константа UIScreenDidConnectNotification не помечена (ошибка), поэтому вам нужно использовать тот же обходной путь.

У слабых ссылок есть обратная сторона. Поскольку он должен делать это при запуске, динамически время запуска сильно сокращается. Вам нужно будет проверить, не слишком ли медленно он для вас.

Другой способ слабого связывания фрейма: выполните команду «Получить информацию» о своей цели и на вкладке «Общие» вы увидите список фреймворков. Измените тип UIKit на Weak.

Кстати, использование #ifdef для проверки не работает, потому что #ifdef являются конструкциями времени компиляции, поэтому UI_USER_INTERFACE_IDIOM всегда будет определяться, потому что вы строите с использованием SDK 3.2

3
ответ дан 15 December 2019 в 00:54
поделиться

Следуйте разделу «Программное определение устройства» на http://iphonedevelopment.blogspot.com/2010/04/converting-iphone-apps-to-universal.html

плюс

#ifndef __IPHONE_3_2 // if iPhoneOS is 3.2 or greater then __IPHONE_3_2 will be defined
  typedef enum { // provided by noblemaster ]:-|
    UIUserInterfaceIdiomPhone, // iPhone and iPod touch style UI
    UIUserInterfaceIdiomPad, // iPad style UI
  } UIUserInterfaceIdiom;
  #define UI_USER_INTERFACE_IDIOM() (([[UIDevice currentDevice].model rangeOfString:@"iPad"].location != NSNotFound) ? UIUserInterfaceIdiomPad : UIUserInterfaceIdiomPhone)
#endif // ifndef __IPHONE_3_2 

в разделе комментариев.

0
ответ дан 15 December 2019 в 00:54
поделиться

Другой способ слабого связывания фрейма: выполните «Получить информацию» о своей цели и на вкладке «Общие» вы увидите список фреймворков. Измените тип UIKit на Weak.

Это помогло мне решить проблему «Символ не найден: _UIScreenDidConnectNotification» на iPhone во время выполнения.

0
ответ дан 15 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: