【问题标题】:viewDidLoad in NSViewController?NSViewController 中的 viewDidLoad?
【发布时间】:2011-03-26 06:28:07
【问题描述】:

在 iPhone 上,我使用UIViewControllerviewDidLoad 运行代码来设置视图。

我如何使用NSViewController 做到这一点?

我试过loadView,但它不起作用...

【问题讨论】:

    标签: objective-c cocoa macos


    【解决方案1】:

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

    【讨论】:

    • 一个可能的危险是,Apple 可能有一天会在 NSViewController 中添加 -viewWillLoad-viewDidLoad 方法。如果是这样,您对这些方法的覆盖将被调用两次。
    • 非常感谢您提供此解决方案!我已经为此搜索了数周。
    • @Mike... 您的担忧是有效的,现在 10.7 Lion 更像 iOS,我认为它可能只是在 Lion 本身中实现。我会密切关注它,所以不用担心,但是是的,否则具有相同的函数名称可能会造成麻烦。
    • 虽然这是一个很好的例子,说明了如何在 OS X 上复制 viewDidLoad 功能,但我更关心在进行 Cocoa 桌面开发时找到“正确”的方法。为 OS X 开发时,在 iOS 上通常在 viewDidLoad 中执行的操作(例如在从 nib 加载视图后设置视图)的正确过程是什么?
    • 这是我在 Mac 上复制 iOS 的 viewDidLoad 时最“正确”的方式。从那以后我又回到了 iOS 开发。
    【解决方案2】:

    从 OS X 10.10 开始,viewDidLoadNSViewController 上可用并受支持。

    在此之前,您必须经过 Snow Leopards 的 release notes 中的这个金块:

    给在 NSViewController 中寻找 -viewWillLoad 和 -viewDidLoad 方法的人的建议

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

    【讨论】:

    • 我已经在stackoverflow.com/questions/4492485/… 上问过了,但不妨也问你:我在文档中阅读了这个并尝试使用 loadView,但我仍然无法理解它对执行的帮助“在笔尖加载后立即”的东西。我在 xib 文件中有一个 NSTabView 已正确连接,但当我在 loadView 中保留断点时它仍然始终为 0x0。
    • -1;过时的!链接的文章不再讨论这个。 :(
    • 我认为 [viewController loadView] 不是替换 viewDidLoad 的有效方法。因为每次调用[viewController view]时系统都会调用这个方法。所以这个方法可以在应用程序运行后多次调用
    • @arufian 你错了。 -loadView 仅在 -view 实际需要加载视图时被调用。如果它已经被加载,它不会调用到-loadView
    • @arufian 也许你忘了连接view 插座?
    【解决方案3】:

    从 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);
    

    【讨论】:

    • 我可以确认这一点。从 Xcode6-B4 开始,Apple 提供的 NSVewController 子类样板包括 - (void)viewDidLoad { [super viewDidLoad]; // Do view setup here. }
    【解决方案4】:

    你为什么不试试这个:

    - (void)awakeFromNib {
        //setup code
        NSLog(@"hello there");
    }
    

    【讨论】:

    • 我倾向于避免在awakeFromNib 中做事,因为它有时会被多次调用。例如调用makeViewWithIdentifier:owner: 并将self 作为所有者传递将导致awakeFromNib 被调用。见developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…
    • kyle 我面临同样的问题,由于 makeViewWithIdentifier:owner 多次调用 awakeFromNib
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      嗯其实我也会这么做的……

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-11
        • 2017-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多