2010-01-14 19 views
5

我打开一个新的问题随动我的最后一个(superview and parentviewcontroller nil after adding a subview)使用相关联的视图类创建一个笔尖。基本上我知道使用子视图是一个好主意,但我不应该有一个ViewController控制另一个ViewController中的子视图。基本上我想要做以下... 我有两个ViewController共享一个公共子视图。我已经创建了该子视图作为一个叫做SearchDate.xib的nib。文件所有者是相应的类SearchDateView.m/h。该类有一个UIBiew内的唯一元素的出口,它是一个标签。 SearchDateView类还有一个用于更改SearchDateView.xib中标签值的函数。我想让我的两个ViewController加载这个笔尖,但显然我不知道如何正确加载笔尖。无论我做什么,最多都不显示,最坏的情况是抛出异常。苹果文档谈论的是将IB中的其他类实例拖入主视图,但似乎没有解决问题。我在我的ViewController一个SearchDateView出口,我尝试在控制器的负载视图这样做:我如何与可以由多个ViewControllers

searchDateView = [[[NSBundle mainBundle] loadNibNamed:@"SearchDateView" owner:self options:nil] objectAtIndex:0]; 
[[self view] addSubview:searchDateView]; 

但我得到这个异常:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MainViewController 0x431fac0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key searchDateLabel.' 

我知道我在做一些完全错误的,但什么是否有正确的方法来创建一个nib,关联视图类来更新该nib中的一些对象,并在不同的控制器中重用该nib?

编辑:鉴于评论或许这还不够清楚。我不想在整个视图中使用相同的nib文件 - 而是使用子视图。因此,举例来说,控制器A有一个映射和一个SearchDateView,而控制器B有一个表视图和一个SearchDateView。所以我不知道如何加载一个子视图到多个控制器...

回答

2

应该使用多个控制器相同的NIB文件是没有问题的,当每一个使用initWithNibName初始化:捆绑:.您通常不会从控制器中加载控制器自己的nib文件。

如果您加载使用loadNibNamed nib文件:::那么你得到一个NSArray中具有限定在其中的对象,所以你不能把它作为直接的景色。得到一个观点的一种方式是使用()或有事找你想要的对象,通过数组进行搜索,但如果你设置所有者:自我,那么它应该连接到连接到文件的所有者自我为文件的所有者会自行网点。但在这种情况下,您可以放弃返回值;你不需要返回的数组。这可能是您的主要问题(如果连接了该插座,则可以用阵列来打折插座)。

可以使用loadNibNamed加载特定的视图对象(假设你从返回的数组中选取它),然后以某种方式显示它,但通常在控制器上使用initWithNibName更容易(在这种情况下,文件的所有者将会成为控制器)。

哦,你还可以设置在Interface Builder控制器笔尖文件。对于多个控制器使用相同的笔尖应该没有问题,因为基本上你只是告诉Interface Builder设置nib文件来执行像initWithNibNamed这样的操作。点击控制器对象并检查巡视窗口。

更新

我可能做到这一点,以使用在多个控制器只有一个视图:

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"FooView" 
               owner:self options:nil]; 
    for (id obj in nib) 
     if ([obj isKindOfClass:[FooView class]]) 
      myNewView = (FooView *)obj; 

(从第8章被盗:将细胞2在示例代码从初iPhone 3开发。)

您可以在IB中使用插座来做到这一点,在这种情况下,您可以省略for循环,但是您可能需要超类为两个控制器声明出口,并告诉Interface Builder File's Owner是该超类的一个实例,因此它知道出口。可能不值得麻烦。

+0

对不起,也许我不太清楚。我不想在整个视图中使用相同的nib文件 - 而是使用子视图。因此,举例来说,控制器A有一个映射和一个SearchDateView,而控制器B有一个表视图和一个SearchDateView。所以我想知道如何将子视图加载到多个控制器中。 – deadroxy 2010-01-14 18:50:18

+0

我更新了我的答案,以便更具体地了解您的情况。 – Nimrod 2010-01-15 03:14:11

+0

是的,超类似乎是我的问题唯一的“真正”解决方案。我可能会稍后重构,但现在我已经找到了一些解决方法 - 谢谢! – deadroxy 2010-01-17 16:44:44

0

我在我的ViewController一个SearchDateView出口,我尝试在控制器的负载视图这样做:

searchDateView = [[[NSBundle mainBundle] loadNibNamed:@"SearchDateView" owner:self options:nil] objectAtIndex:0]; 
[[self view] addSubview:searchDateView]; 

但我得到这个异常:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MainViewController 0x431fac0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key searchDateLabel.' 

在没有可可绑定(只可可,而不是Cocoa Touch),我不认为这两个是相关的。

在Xcode中,在objc_exception_throw上添加一个符号断点,然后在调试器中运行您的应用程序。当它中断时,查看调用堆栈。你将能够找到问题的真正起源。

相关问题