在接口构建器和模块化中使用“外部对象”

时间:2011-07-06 15:30:48

标签: objective-c ios interface-builder

这是关于最佳做法的问题。

我有一个使用标准iOS标签控制器的应用程序。

我想做的其中一件事是将XIB拆分为单独的文件。我可以通过在每个选项卡控制器的“NIB名称”部分中指定“子”XIB来实现此目的。到目前为止,非常好。

在这个应用程序中,我有一个几乎所有UIViewControllers都使用的对象(例如:提供Web服务调用)。我们称之为MyServices。

在单个XIB解决方案中,我可以将对象拖到“对象”列表中,将类型设置为“MyServices”。我可以在每个ViewController中声明一个MyServices *类型的IBOutlet,并将两者连接在一起。这很好用。

但是,如果我将视图移到单独的XIB上,那么需要访问MyServices对象的堆栈中的任何控制器都运气不好,因为该XIB中的对象不再存在以执行连接。

我期望能够做的是声明一个'外部对象',然后连接到那个。但我无法看到我如何将'父'XIB中的MyServices对象作为子XIB中的'外部'对象传递。

IB不支持这个吗?什么是最好的选择?

我无法在控制器中指定XIB名称,也许在运行时以编程方式创建它(可能是某种loadFromNib代码声明字典以提供外部对象)。这意味着执行此操作的控制器必须知道MyServices,即使它不直接使用它。

或者,我可以在每个UIViewController中都有一个'dataProvider',所以不是直接将MyServices设置为IBOutlet,而是可以做[dataProvider getServices]。同样,必须连接到可以做到这一点的事情 - 这限制了XIB可以被分解的地方。感觉有点不必要的冗长......

这里的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

看起来使用外部对象,您可以将对象实例化放回到您自己的手中,您还必须手动实例化NIB。至少这是我从How to use a common target object to handle actions/outlets of multiple views?

的回答中收集的内容

Can I use Interface Builder to inject dependencies across multiple nibs?向你提出非常相似的问题,也没有真正的解决方案。

How do I set up a proxy object in the main application NIB?中,作者也放弃了使用Interface Builder作为依赖注入工具的想法。

所以我猜我们这些爪哇移民正在撞击隐形墙。我们用来塑造我们头脑中的代码的隐喻(以及我们已经开始重视并与质量相关联的代码质量)不适用于Objective-C。那可能是因为我们不熟悉Obj-C习语。或者可能是,我们正在处理语言和社区发展的不同演化阶段(例如,参见Obj-C中TDD实践的惊人不成熟)。我个人认为,在我认真处理它的9个月里,Obj-C世界中没有看到太多最佳实践