Обратная совместимость Xcode OSX

Как использовать такие функции, как viewDidLoad или appDidBecomeActive в Xcode 4.6.1 для OSX 10.8, которые доступны только для OSX 10.10 и выше. Пожалуйста, предложите альтернативные способы использования этих функций.


person user2715756    schedule 11.05.2015    source источник
comment
Я не ожидаю, что ты сможешь это сделать. У вас довольно устаревшая версия Xcode.   -  person Almo    schedule 11.05.2015
comment
Вместо переопределения -viewDidLoad просто переопределите -loadView. Позвоните на super, а затем введите любой дополнительный код после этого. Это фактически просмотр-загрузка кода. Что касается appDidBecomeActive, похоже, он не является частью какого-либо Cocoa API. Где вы это нашли?   -  person Ken Thomases    schedule 11.05.2015
comment
Вы можете использовать только то, что доступно через поддерживаемый SDK.   -  person Volker    schedule 11.05.2015
comment
Когда вы говорите appDidBecomeActive, вы имеете в виду applicationDidBecomeActive:? Это было частью OS X с 10.0.   -  person JWWalker    schedule 12.05.2015
comment
@KenThomases: спасибо, это работает и   -  person user2715756    schedule 12.05.2015
comment
@JWWalker: вот что я имею в виду, applicationDidBecomeActive - это то, о чем я говорю ....   -  person user2715756    schedule 12.05.2015


Ответы (2)


Чтобы расширить комментарий Кена Томаса; это код, который я использую:

- (void)loadView
{
    [super loadView];

    // if we're running on 10.8 or older…
    if (NSAppKitVersionNumber <= NSAppKitVersionNumber10_8) {
        [self viewDidLoad]; // call viewDidLoad (added in 10.9)
    }
}

//
// This will be called by loadView pre-10.9; directly otherwise
//
- (void)viewDidLoad {
    // --- YOUR CODE HERE ---
}   // viewDidLoad
person geowar    schedule 12.05.2015
comment
Спасибо за совет. Есть ли причина вызывать [super viewDidLoad]; из производного класса? - person ATV; 17.07.2015
comment
Это будет зависеть от того, реализует ли суперкласс метод viewDidLoad. Чтобы быть параноиком, вы можете использовать instancesRespondToSelector в суперклассе, чтобы определить, реализован ли он там. Примечание: отправка responsesToSelector: в super эквивалентна отправке самому себе. Вместо этого вы должны вызвать метод instancesRespondToSelector класса NSObject: вы не можете просто использовать [[self superclass] instancesRespondToSelector:@selector(aMethod)], поскольку это может привести к сбою метода, если он вызывается подклассом. - person geowar; 17.07.2015
comment
Разве это не должно быть NSAppKitVersionNumber <= NSAppKitVersionNumber10_9, поскольку заголовок указывает, что viewDidLoad не было добавлено до 10.10. - person spinacher; 29.04.2016
comment
В качестве альтернативы явная проверка версии может быть заменена на if (![NSViewController instancesRespondToSelector:@selector(viewDidLoad)])…. - person spinacher; 29.04.2016

Я бы переопределил setView

@interface MyViewController : NSViewController 
@end

@implementation MyViewController 
- (void)setView:(NSView*)v {
    super.view = v;
    // if we're running on 10.8 or older…
    if (NSAppKitVersionNumber <= NSAppKitVersionNumber10_8) {
        [self viewDidLoad]; // call viewDidLoad (added in 10.9)
    }
}
@end
person Daij-Djan    schedule 14.10.2015