IBOutlet 未在 Cocoa MVC 项目中设置

Posted

技术标签:

【中文标题】IBOutlet 未在 Cocoa MVC 项目中设置【英文标题】:IBOutlet not getting set in Cocoa MVC project 【发布时间】:2009-05-12 21:54:35 【问题描述】:

我可能没有正确使用 IBOutlet,或者 NIB 文件工作方式的其他一些微妙之处给我带来了麻烦 - 任何帮助都将不胜感激(请随时提出另一种方法来完成我想要的事情)。

我有一个 View 对象和一个 Controller 对象。两者都在NIB中。当加载 NIB 并在 'awakeFromNib' 回调中初始化 View 时,也会调用 Controller 的 init。 我需要一种方法来连接这两个对象 - 具体来说,启用“视图”对象来调用控制器上的函数。

根据在线文档,实现这些连接的方法是在 View 中定义一个 IBOutlet 并将其连接到 Interface Builder 中的 Controller。所以我创建了一个

IBOutlet Controller* _controller;

在 View 界面中,并通过从 View 到 Controller 的连接并将 _controller 出口分配给 Controller(Interface Builder 中的蓝色 Generic Object 框)以图形方式将其连接到 Interface Builder 中的 Controller 对象。

但在运行时,_controller 始终为 _nil。我已经验证了Controller的init确实被调用了。

我对此有什么明显的遗漏吗? 有没有更简单的方法来连接这两者?由于它们都是由 NIB 创建的,因此我没有指向两者的公共对象。

【问题讨论】:

nib 的所有者是哪个对象? 【参考方案1】:

尝试在viewDidLoad instad 中访问IBOutlet

awakeFromNib 被调用时,并非所有IBOutlets 都被填充(尽管文档似乎暗示了这一点)。

【讨论】:

我没有尝试在 awakeFromNib 中使用它...我在很久以后才使用它,当菜单单击导致某些代码在 View 对象中执行时。我需要担心一些 refcounting foo 吗? 顺便说一句,我希望一旦设置了 IBOutlet,它就应该可以使用,直到清理完成......这有效吗? 所有 IBOutlets 在 awakeFromNib 时设置,除非你没有在 nib 中设置它们。如果这从未发生过,要么你在处理多个笔尖并且做得很差,要么(不太可能)你发现了一个错误。在后一种情况下,您应该举报 (bugreport.apple.com)。 原来我需要终止所有连接并重新执行NIB。那解决了它。我很惊讶没有一种编程方式将这些对象链接在一起......我认为使用 UI 工具太容易出错,并且将来无法查看。

以上是关于IBOutlet 未在 Cocoa MVC 项目中设置的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa - 将 IBOutlet 链接到单独的 Nib

ViewBag 未在混合 Webforms/MVC 项目中声明

条形按钮项目未在 SWIFT 中显示

在模态视图的父视图中访问 IBOutlet

基于 Cocoa 文档的应用程序中的 MVC

.Net 中的 MVVM 与 Cocoa 中的 MVC 有何不同?