Директива препроцессора в xib? - PullRequest
2 голосов
/ 06 октября 2011

Несмотря на все поиски, я не могу найти ответ на свой вопрос. Итак, посмотрим, насколько вы хороши. :)

Я работаю над приложением, использующим NSPopover, которое доступно только в 10.7 Lion, но я хочу, чтобы приложение компилировалось для 10.5 и выше. Я использую директиву препроцессора, чтобы обернуть связанный код popover, который, кажется, делает свое дело ... Однако, последний кусок, в котором я все еще получаю ошибки, - это .zib в Интерфейсном Разработчике. Как мне исправить ошибки, показанные в Навигаторе проблем, в котором говорится: «Класс недоступен: NSPopover в версиях Mac OS X до 10.7»?

#ifdef __MAC_OS_X_VERSION_MAX_ALLOWED
    #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
        @property (assign) IBOutlet NSPopover *popover;
    }
    #endif
#endif

Вышеописанное работает в xxx.h и xxx.m, но как мне обойти ошибки .xib?

Несмотря на ошибку (красный), он успешно строится. Однако я ошибаюсь, ожидая, что функции 10.7 (popover) будут работать в 10.7, потому что они не ... Что мне здесь не хватает?

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

Вы не должны использовать препроцессоры для этого, но проверьте доступность во время выполнения, используя NSClassFromString(). Препроцессор запускается во время компиляции, поэтому он не будет определять, на какой системе запущено приложение.

Создайте три пера, по одному для каждого из 10.5, 10.6 и 10.7, и загрузите нужный вам (или сделайте это в коде), но выберите, какой из них во время выполнения, а не во время компиляции, например,

MyVC *vc = nil;
if (NSClassFromString(@"NSPopover"))
{
    vc = [NSViewController initWithNibName:@"MyVC-Lion" bundle:nil];
}
else if (/* check for 10.6+ only features */)
{
    vc = [NSViewController initWithNibName:@"MyVC-SL" bundle:nil];
}
else
{
    vc = [NSViewController initWithNibName:@"MyVC" bundle:nil];
}
// ...
1 голос
/ 06 октября 2011

Не реальный ответ на ваш вопрос, извинения, но 2 возможных обходных пути: разве невозможно создать 2 версии вашей xib, и в зависимости от цели, компилировать или нет?Это было бы немного больше для обслуживания, но если ваш пользовательский интерфейс довольно стабилен, это должен быть самый простой способ.

Или вы можете программно добавить свой "10.7 специфический" компонент (ы) интерфейса вместо использованиятам жеЕсли у вас есть только один или несколько всплывающих окон, это не должно быть сложно сделать, и охрана пропроцессора будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...