我有两个VIEwControllers,它们共享一个共同的子视图.我已经将该子视图创建为一个名为SearchDate.xib的笔尖.文件所有者是相应的类SearchDateVIEw.m / h.该类有一个出口,用于nib中UIVIEw内部唯一的元素,它是一个标签. SearchDateVIEw类还具有更改SearchDateVIEw.xib中标签值的功能.我希望我的两个VIEwControllers加载这个笔尖,但显然我不知道如何正确加载笔尖.无论我做什么,最好什么都不显示,最坏的情况是抛出异常.苹果文档谈到将IB中其他类的实例拖入主视图,但这似乎没有成功.我在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.'
我知道我做了一些完全错误的事情,但是有一个nib,关联的视图类更新该nib中的一些对象,并在不同的控制器中重用该nib的正确方法是什么?
编辑:鉴于评论可能这还不够明确.我不想在整个ENTIRE视图中使用相同的nib文件 – 而是使用子视图.因此,例如,控制器A具有映射和SearchDateVIEw,控制器B具有表视图和SearchDateVIEw.所以我想知道如何将子视图加载到多个控制器中……
解决方法 当使用initWithNibname初始化每个控制器时,使用相同的NIB文件应该没有问题:bundle:.您通常不会从控制器内加载控制器自己的nib文件.如果使用loadNibnamed :::加载nib文件,则会获得其中定义了对象的NSArray,因此您无法直接将其用作视图.获取视图的一种方法是使用for()或其他东西搜索数组以找到所需的对象,但是如果你设置owner:self,那么它应该连接到连接到file的所有者的出口,因为file的所有者将是self .但是你可以在这种情况下丢弃返回值;你不需要返回的数组.如果您连接了该插座,这可能是您的主要问题(用阵列破坏插座).
可以使用loadNibnamed来加载特定的视图对象(假设你从返回的数组中选择它),然后以某种方式显示它,但通常更容易在控制器上使用initWithNibname(在这种情况下,file的所有者将是控制器) .
哦,您还可以在Interface Builder中为控制器设置nib文件.对于多个控制器使用相同的nib应该没有问题,因为基本上你只是告诉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章:来自Beginning iPhone 3开发的示例代码中的单元格2).
您可以通过IB中的出口执行此 *** 作,在这种情况下您可以省略for循环,但是您可能需要为两个控制器声明插座的超类,以及告诉Interface Builder file的所有者是该超类的实例的东西所以它知道插座.可能不值得麻烦.
总结以上是内存溢出为你收集整理的iphone – 如何使用可由多个ViewControllers使用的关联View类创建Nib全部内容,希望文章能够帮你解决iphone – 如何使用可由多个ViewControllers使用的关联View类创建Nib所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)