![](/img/trans.png)
[英]how to do remote kernel degugging on Maverics 10.9 OSX using lldb?
[英]How do views load on OSX 10.9?
我只在OSX 10.10+上进行开发,我希望我的应用程序在10.9和10.10+上均可使用。 我遇到的问题是viewDidLoad()仅在10.10+上可用。 如何灵活地使用视图和视图控制器来在两者上工作?
通过查看源代码,看起来我需要重写init吗? 但是,当覆盖init:nibName:nibBundleOrNil:时,它也需要init:coder,这对我来说没有多大意义(在源代码中未记录)。
在10.10之前,NSViewController基本上什么都不做(这是NSWindowController所做的大部分工作);)在10.10上,它获得了与iOS世界类似的方法(viewDidLoad ...),并且一件非常重要的事情最终被自动放入NSResponder中。链(NSApp sendAction:...将检查viewController是否具有该方法)。
那么如何获得功能呢?
因此,如果使用情节提要板,则需要进行大量工作。 如果您没有干净的MVC / MVVM架构,那么就不值得了。
另一种选择是将您的班级pre10.10和after10.10加倍,但这意味着要解雇两次相同的代码(一次使用故事板,一次使用XIB)。
编辑:
如@geowar建议,您可以覆盖loadView。 请注意,您仍然无法使用情节提要,您必须手动将viewController添加到responseerChain
- (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。
给在NSViewController中寻找-viewWillLoad和-viewDidLoad方法的人的建议
即使NSWindowController具有-windowWillLoad和-windowDidLoad方法供您覆盖Mac OS 10.5中引入的NSViewController类,也没有对应的-viewWillLoad和-viewDidLoad方法。 您可以重写-[NSViewController loadView]以自定义在视图控制器完成笔尖加载之前或之后立即发生的事情。
使您在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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.