NSViewController中的viewDidLoad?

时间:2010-08-06 10:17:23

标签: objective-c cocoa macos

在iPhone中

我做UIViewController viewDidLoad并编写一些设置代码来设置视图 但是我怎么能在NSViewController中做到这一点? 我已尝试使用loadView但它不起作用... 也许我做错了什么我不知道...

PS:我刚开始使用OSX / iOS编程,很抱歉,如果我问一些愚蠢的话:(

6 个答案:

答案 0 :(得分:49)

我在发表评论的几分钟内就明白了。将我的发现添加为答案,因为它是文档中缺少的一个示例。下面的代码将为您提供所需的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

答案 1 :(得分:41)

自OS X 10.10起,viewDidLoad可以使用并NSViewController支持{{1}}。

在此之前,你必须在Snow Leopards'release notes中使用这个金块:

  

为在NSViewController中寻找-viewWillLoad和-viewDidLoad方法的人提供建议

     

即使NSWindowController具有-windowWillLoad和-windowDidLoad方法,您可以覆盖Mac OS 10.5中引入的NSViewController类,但没有相应的-viewWillLoad和-viewDidLoad方法。您可以覆盖 - [NSViewController loadView]来自定义在视图控制器完成nib加载之前或之后立即发生的事情。

答案 2 :(得分:9)

从OSX 10.10(Yosemite)开始,-viewDidLoad中现在有-viewWillAppear-viewDidAppear-viewWillDisappearNSViewController。有关详细信息,请参阅WWDC 2014 - Storyboards and Controllers on OS X session,了解每个人何时被调用等等。

以下是关于-viewDidLoad:

的10.10标题文档中的相关位
  

加载视图后调用。对于在中创建的视图控制器   代码,这是在-loadView之后。对于从a取消归档的视图控制器   nib,这是在视图设置之后。默认不做任何事。

- (void)viewDidLoad NS_AVAILABLE_MAC(10_10);

答案 3 :(得分:5)

为什么不试试这个:

- (void) awakeFromNib{

//setup code
NSLog(@"hello there");
}

答案 4 :(得分:0)

看起来在10.10中,viewDidLoad现在在NSViewController中。

答案 5 :(得分:-5)

实际上我也会这样做......

- (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];
}