Xcode OSX的向后兼容性

3

如何在Xcode 4.6.1中使用viewDidLoadappDidBecomeActive等功能,这些功能只适用于OSX 10.10及以上版本。请提供使用这些函数的替代方法。


我不认为你能做到这一点。你的Xcode版本相当过时。 - Almo
不要实现 -viewDidLoad 的重写,而是重写 -loadView。调用 super 然后在其后添加任何其他代码。这就是有效的“view-did-load”代码。至于 appDidBecomeActive,它似乎不是 Cocoa API 的一部分。你在哪里找到的? - Ken Thomases
你只能使用SDK支持的可用内容。 - Volker
当你说 appDidBecomeActive 时,你是指 applicationDidBecomeActive: 吗?这已经是自从 OS X 10.0 版本以来的一部分了。 - JWWalker
@KenThomases:谢谢,是的,它可以工作。 - user2715756
@JWWalker:是的,我指的就是applicationDidBecomeActive方法。 - user2715756
2个回答

3

扩展Ken Thomas的评论; 这是我使用的代码:

- (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

谢谢你的提示。从派生类中调用[super viewDidLoad];有什么理由吗? - ATV
这取决于超类是否实现了viewDidLoad方法。为了谨慎起见,您可以在超类上使用instancesRespondToSelector来确定它是否已经实现。注意:向super发送respondsToSelector:等同于向self发送。相反,您必须调用NSObject类方法instancesRespondToSelector:。您不能简单地使用[[self superclass] instancesRespondToSelector:@selector(aMethod)],因为如果由子类调用该方法,则可能导致方法失败。 - geowar
这不应该是 NSAppKitVersionNumber <= NSAppKitVersionNumber10_9 吗?因为头文件表明 viewDidLoad 直到 10.10 才被添加。 - spinacher
或者,可以通过以下方式替换显式版本检查:if (![NSViewController instancesRespondToSelector:@selector(viewDidLoad)])… - spinacher

0

我会重写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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接