UIViewController从.xib初始化自己的子类不能使用UINavigationItem?

时间:2010-02-11 23:56:24

标签: iphone iphone-sdk-3.0 uiviewcontroller interface-builder

我终于不得不放弃无情地寻找这个问题的答案,因为我找不到之前曾问过的人!所以希望有人能提供一些见解。我将从解释我能做什么开始,然后将其与我无法弄清楚如何做的进行比较。

假设我有一个名为RootViewController的自定义VC。它包含MyViewController类型的插座。我的RootViewController有一个.xib,它包含一个从IB的调色板拖出的通用VC对象,它给出了MyViewController的类类型,我将右边的条形按钮项设置为一个名为'Cancel'的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,将File的Owner设置为MyViewController类型,放入UINavigationItem并添加UIBarButtonItem。我现在有一个.xib结构与以前相同,除了它不使用IB的通用VC对象作为单独的顶级对象,.xib VC定义,而不是包含VC定义的东西

所以,假设File的Owner是一个MyViewController,并且是UIViewController的子类(假设你继承了使用IB调色板中的UIViewController获得的所有东西),那么我应该继承它的超类的所有功能......除了它没有“T

当unxived中的.xib时,它不会挂钩UINavigationItem。因此,当它被推送到导航堆栈时,不会显示任何条形按钮项目。

UIViewControllers navigationItem属性是只读的,因此不推荐在iPhone OS 3.0中为它创建插座。

那么,在所有这些的最后,nib加载代码如何设法将IB的VC对象版本连接到导航项?为什么,即使我的对象通过继承是一个UIViewController,它不会为我的对象做它吗?我完全不知道这件事......

感谢您阅读此内容!希望听到你的大师的

2 个答案:

答案 0 :(得分:0)

只有UINavigationController设置UIViewController的navigationItem属性。做这样的事情:

MyViewController *viewController = [[MyViewController alloc] init];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];

假设您在已有导航控制器的视图控制器中。推后,您将能够从MyViewController内部访问navigationItem。

答案 1 :(得分:0)

是的,我想我现在明白了。我以为我会回答我自己的问题,因为我看到至少有一个人问过类似的问题,而且两者似乎都指出了相同的结论,所以我希望这对其他人有帮助。

基本上(这听起来很明显)UIViewController不是代理对象!它并不是很明显,因为我们都习惯了如果任何两个对象从同一个基类继承,那么它们的实现是相同的,它们的行为方式完全相同(假设在继承类中没有自定义)。但是IB对象的类型与您可以分配给这些对象的类属性不同。 它们不是UIViewController对象,因为它们的类属性以这种方式设置。

在IB中简单设置这些对象的class属性并不意味着这些对象现在是UIViewController对象。 View Controller对象仍然是View Controler对象,代理对象仍然是代理对象。就IB而言,它们都是非常不同的野兽,它们碰巧具有相同的类属性。

只需查看.xib,您就会发现您的IB视图控制器对象已经存档,如下所示:

<object class="IBUIViewController" id="...">
    ...
</object>

代理对象(设置为UIViewController的子类)的存档方式如下:

<object class="IBProxyObject" id="...">
    ...
</object>

正如您所看到的,它们是非常不同的类型,一个是IBUIViewController,另一个是IBProxyObject - 然后它开始有意义 - 您不能将CM控制器属性强加于IBProxyObject类型的对象。

值得注意的是,类类型是IBUIViewController对象而不仅仅是UIViewController对象。这是否只是一个命名约定我不知道,但它也可能暗示IB的视图控制器对象包装实例化的VC对象,或者是它的工厂对象。例如,您可以在IB的视图控制器对象中设置“从NIB调整视图”属性 - 但是我在UIViewController参考文档中找不到等效的属性或方法。

总而言之,如果您尝试以编程方式实例化对象而不是使用IB对象的出口,请准备实施IB版本为您提供的一些初始化...