【发布时间】:2011-03-26 06:28:07
【问题描述】:
在 iPhone 上,我使用UIViewController 的viewDidLoad 运行代码来设置视图。
我如何使用NSViewController 做到这一点?
我试过loadView,但它不起作用...
【问题讨论】:
标签: objective-c cocoa macos
在 iPhone 上,我使用UIViewController 的viewDidLoad 运行代码来设置视图。
我如何使用NSViewController 做到这一点?
我试过loadView,但它不起作用...
【问题讨论】:
标签: objective-c cocoa macos
我在发表评论后的几分钟内就明白了。添加我的发现作为答案,因为它是文档中缺少的示例。下面的代码将为您提供所需的 viewDidLoad 方法。它如此简单,以至于我想知道为什么 Apple 还没有在 OS X 中实现它。
- (void)viewWillLoad {
if([NSViewController instancesRespondToSelector:@selector(viewWillLoad)]) {
[super viewWillLoad];
}
...
}
- (void)viewDidLoad {
if([NSViewController instancesRespondToSelector:@selector(viewWillLoad)]) {
[super viewDidLoad];
}
}
- (void)loadView {
BOOL ownImp = ![NSViewController instancesRespondToSelector:@selector(viewWillLoad)];
if(ownImp) {
[self viewWillLoad];
}
[super loadView];
if(ownImp) {
[self viewDidLoad];
}
}
原文来源:http://www.cocoabuilder.com/archive/cocoa/195802-garbage-collection-leaks-and-drains.html
【讨论】:
NSViewController 中添加 -viewWillLoad 和 -viewDidLoad 方法。如果是这样,您对这些方法的覆盖将被调用两次。
从 OS X 10.10 开始,viewDidLoad 在NSViewController 上可用并受支持。
在此之前,您必须经过 Snow Leopards 的 release notes 中的这个金块:
给在 NSViewController 中寻找 -viewWillLoad 和 -viewDidLoad 方法的人的建议
尽管 NSWindowController 有 -windowWillLoad 和 -windowDidLoad 方法让您覆盖 Mac OS 10.5 中引入的 NSViewController 类,但没有对应的 -viewWillLoad 和 -viewDidLoad 方法。您可以覆盖 -[NSViewController loadView] 以自定义视图控制器完成 nib 加载之前或之后立即发生的情况。
【讨论】:
-loadView 仅在 -view 实际需要加载视图时被调用。如果它已经被加载,它不会调用到-loadView
view 插座?
从 OSX 10.10 (Yosemite) 开始,NSViewController 中现在有 -viewDidLoad、-viewWillAppear、-viewDidAppear、-viewWillDisappear。请参阅WWDC 2014 - Storyboards and Controllers on OS X session 了解更多信息,了解每个人何时被调用,等等。
这是 10.10 标头文档中关于 -viewDidLoad: 的相关内容
在视图加载后调用。对于创建的视图控制器 代码,这是在 -loadView 之后。对于未归档的视图控制器 笔尖,这是在视图设置之后。默认什么都不做。
- (void)viewDidLoad NS_AVAILABLE_MAC(10_10);
【讨论】:
NSVewController 子类样板包括 - (void)viewDidLoad { [super viewDidLoad]; // Do view setup here. }!
你为什么不试试这个:
- (void)awakeFromNib {
//setup code
NSLog(@"hello there");
}
【讨论】:
awakeFromNib 中做事,因为它有时会被多次调用。例如调用makeViewWithIdentifier:owner: 并将self 作为所有者传递将导致awakeFromNib 被调用。见developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…。
看起来在 10.10 中,viewDidLoad 现在在 NSViewController 中。
【讨论】:
嗯其实我也会这么做的……
- (void)viewWillLoad {
if (! bool_viewwillload) {
// execute the code
bool_viewwillload = true;
}
}
- (void)viewDidLoad {
if (! bool_viewdidload) {
// execute the code
bool_viewdidload = true;
}
}
然后像这样制作加载视图
- (void)loadView {
[self viewWillLoad];
[super loadView];
[self viewDidLoad];
}
【讨论】: