我只是在OSX 10.10+上开发,我希望我的应用程序可以在10.9和10.10+上运行。我遇到的问题是viewDidLoad()仅适用于10.10+。如何灵活地查看和查看控制器以同时使用它们?
从查看源代码看起来我需要覆盖init?但是当覆盖init:nibName:nibBundleOrNil:但它也需要init:coder,这对我来说没有多大意义(它在源代码中没有记录)。
答案 0 :(得分:0)
在10.10之前,NSViewController基本上什么都不做(这是NSWindowController做的大部分工作);)在10.10它获得了类似于iOS世界(viewDidLoad ...)的方法和一个非常重要的事情,它终于被放了自动进入NSResponder链(NSApp sendAction:...将检查viewController是否有方法)。
那么如何获得功能?
因此,如果您使用故事板,那么它需要做很多工作。如果你没有干净的MVC / MVVM架构,那么它就不值得。
替代方法是在10.10之前和10.10之后加倍你的类,但这意味着将相同的代码放置两次(一次使用故事板,一次使用XIB)。
编辑:
正如@geowar建议您可以覆盖loadView。请注意,您仍然无法使用故事板,您必须手动将viewController添加到responderChain
- (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)
}
}
可选地
- (void)setView:(NSView*)view {
super.view = view;
// if we're running on 10.8 or older…
if (NSAppKitVersionNumber <= NSAppKitVersionNumber10_8) {
[self viewDidLoad]; // call viewDidLoad (added in 10.9)
}
}
@end
EDIT2:
在loadView之后调用awakeFromNib(它从xib获取新视图并实例化它)。正如@ Daij-Djan所建议的那样,另一种解决方案是覆盖setter。
为寻找-viewWillLoad和-viewDidLoad的人提供建议 NSViewController中的方法
即使NSWindowController有-windowWillLoad和-windowDidLoad 用于覆盖引入的NSViewController类的方法 Mac OS 10.5没有相应的-viewWillLoad和-viewDidLoad 方法。您可以覆盖 - [NSViewController loadView]进行自定义 在nib加载完成之前或之后立即发生的事情 由视图控制器。
答案 1 :(得分:0)
让你在10.9上相当于10.10写一个像这样的VC
@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