是否有一个易于理解的指南(Cocoa,Xcode等新手册),用于讨论代理对象的Interface Builder?

时间:2009-04-25 16:18:39

标签: xcode cocoa cocoa-touch interface-builder

早在C / C ++的那一天,真正让我兴奋的语言部分就是指针。我当然理解他们。

现在,Interface Builder代理对象或者更重要的是,如何使用Interface Builder以及在给定XIB的.XIB窗口(包含文件所有者,第一响应者等的窗口等)中放置什么。

我已经通过Xcodes示例和网络上发现的书籍和样本中的大量示例进行了介绍。他们一直很有帮助,但我仍然感到有点失落。

我觉得理解IB对于理解如何编写Mac / iPhone / iPod touch应用非常重要。

到目前为止,我已经浏览了以下资源: Aaron Hillegass'适用于Mac OS X的可可编程 务实的程序员资源:   在Xcode中变得富有成效(截屏视频)   可可程序设计   Objective-C 2.0编码(screncast)   编写您的第一个iPhone应用程序(截屏视频)   iPhone SDK开发

我还浏览了Apple的Interface Builder用户指南PDF。

任何建议的提示/资源将不胜感激!

4 个答案:

答案 0 :(得分:44)

首先,占位符在这里比代理更好。

通常,当您在NIB / XIB文件中有对象时,这意味着加载NIB文件将创建该实例。占位符对象是加载NIB文件时已存在的对象,它们出现在NIB内部,以便您可以通过加载NIB和已存在的对象在将要创建的对象之间建立连接。

文件的所有者,第一响应者和应用程序都是占位符。

文件的所有者是将加载nib的对象的占位符。所有NIB加载方法都采用'owner'参数。当您与文件所有者建立连接时,当它在运行时建立时,它将连接到传递给nib加载方法的所有者对象。许多UIKit和AppKit类为您调用nib加载方法。 NSApplicationNSViewControllerNSWindowControllerUIApplicationUIViewController代表您加载NIB文件。当他们这样做时,他们将self作为所有者参数传递给nib加载方法。这就是为什么当您使用视图控制器或窗口控制器时,您将文件的所有者设置为子类,并在视图和文件所有者之间建立大部分连接。

NSApplication实例是[NSApplication sharedApplication]的简单占位符。这是一个全局单例,Interface Builder中的图标代表全局单例。加载NIB文件不会创建第二个NSApplication实例。相比之下,当NIB文件包含一个窗口时,如果你加载它十几次,你将有十几个窗口实例,但仍有一个NSApplication实例。

第一响应者是独一无二的。将动作连接到第一响应者意味着当动作被触发时,它应该动态地发送到响应者链。响应者链通常以聚焦视图开始,并继续向上通过视图层次结构并包括一些控制器和委托。链中的每个对象都有一个处理动作的镜头。菜单项与响应链相结合。如果你有一个“Make Bold”的菜单项,它应该使当前选中的文本变为粗体,你可以从挂钩到NSApplication子类开始,但是你必须知道所有的情况“大胆”应用,以及如何处理它们。文本视图和可编辑的Web视图可能需要不同的代码来处理“make bold”并在一个对象中装箱这将变得非常复杂并且不会非常可扩展。相反,您可以将“Make Bold”菜单项的操作连接到First Responder上的makeBold:操作。这意味着当选择菜单项时,焦点对象或响应makeBold:的父对象之一将获得makeBold:消息。现在,许多类可以实现makeBold:方法,并在它们处于焦点时响应此菜单项。

答案 1 :(得分:1)

除了“文件所有者”(在加载nib / xib时它被连接),你在IB中创建的对象是真实对象,而不是代理对象。

您可能希望查看一些现有的示例代码,以了解IB如何解决问题。你读过的文档/教程中有什么东西会让你感到困惑吗? “失去一点点”很难做到。

答案 2 :(得分:1)

Apple提供了以下文档,其中解释了Interface Builder NIB / XIB文件中的文件所有者第一响应者应用占位符对象:

Interface Builder User Guide: Placeholder Objects

我在你的问题中意识到你曾提到阅读Apple的Interface Builder文档,但我认为在此发布这个文章以供将来参考是合适的。此外,自首次提出问题以来,文档已经更新,因此从那时起他们就可以更清楚地了解文档。

答案 3 :(得分:0)