【发布时间】:2011-01-15 23:05:12
【问题描述】:
我终于不得不放弃不懈地寻找这个问题的答案,因为我找不到以前问过这个问题的人!所以希望有人能提供一些见解。我将首先解释我能做什么,然后将其与我不知道该怎么做进行比较。
假设我有一个名为 RootViewController 的自定义 VC。它包含一个 MyViewController 类型的插座。我的 RootViewController 有一个 .xib,其中包含一个从 IB 调色板中拖出的通用 VC 对象,该对象被赋予 MyViewController 的类类型,我将右栏按钮项设置为名为“取消”的 UIBarButtonItem。 RootViewController 将其解档为 .xib,将插座连接到 MyViewController 对象,我将所述对象推送到按预期显示的导航堆栈上,我在导航栏上有一个视图和一个显示“取消”的按钮。
这种方法的问题是我希望 MyViewController 可以在任何可能想要创建 MyViewController 的对象中重复使用。因此,这意味着“文件的所有者”可以是任何对象。以前它是 RootViewController,但是如果另一个对象想要实例化一个 MyViewController 怎么办?文件所有者每次都会不同。我还希望它能够从一个非常独立的.xib 中完全初始化自己。基本上,我想这样做:
MyViewController *myVC = [[MyViewController alloc] init];
在 MyViewController 的实现中,我这样写:
- (id)init
{
if ( self = [super initWithNibName:@"MyViewController" bundle:nil] )
{
// Initialisation
}
}
这巧妙地隐藏了用于初始化 VC 的 .xib 的名称,利用了 IB 在配置控制器和视图时为我提供的所有优点,并且 MyViewController 始终是所有者,这意味着我也解决了文件所有者问题 -它适用于创建它的任何类型的类。
因此,为了实现这一点,我创建了一个 .xib,将文件的所有者设置为 MyViewController 类型,放入 UINavigationItem 并添加 UIBarButtonItem。我现在有一个结构与以前相同的 .xib,除了它不使用 IB 的通用 VC 对象作为单独的顶级对象,.xib 是 VC 定义,而不是包含 VC 定义的东西.
因此,鉴于 File's Owner 是 MyViewController 并且是 UIViewController 的子类(据说继承了您通过使用 IB 调色板中的 UIViewController 获得的所有内容),那么我应该继承它的超类的所有功能......除非它没有不。
当 .xib 未归档时,它不会连接 UINavigationItem。因此,当它被推送到导航堆栈时,不会显示任何条形按钮项。
UIViewControllers navigationItem 属性是只读的,因此不推荐在 iPhone OS 3.0 中为其创建 outlet。
那么,最后,nib 加载代码到底是如何设法将 IB 版本的 VC 对象连接到导航项的呢?为什么,即使我的对象 是 通过继承的 UIViewController,它不会为我的对象做呢?我完全无法理解这一点......
感谢您阅读本文!希望听听大师的意见
【问题讨论】:
标签: iphone iphone-sdk-3.0 uiviewcontroller interface-builder