dea*_*oxy 5 iphone cocoa uiviewcontroller nib
我正在打开一个新问题来跟进我的最后一个问题(在添加子视图后,superview和parentviewcontroller为nil).基本上我认为使用子视图是一个好主意,但我不应该有一个ViewController控制住在另一个ViewController内的子视图.基本上我想做以下...我有两个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];
Run Code Online (Sandbox Code Playgroud)
但是我得到了这个例外:
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MainViewController 0x431fac0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key searchDateLabel.'
Run Code Online (Sandbox Code Playgroud)
我知道我做了一些完全错误的事情,但是有一个nib,关联的视图类更新该nib中的一些对象,并在不同的控制器中重用该nib的正确方法是什么?
编辑:鉴于评论可能这还不够明确.我不想在整个ENTIRE视图中使用相同的nib文件 - 而是使用子视图.因此,例如,控制器A具有映射和SearchDateView,控制器B具有表视图和SearchDateView.所以我想知道如何将子视图加载到多个控制器中......
当使用 initWithNibName:bundle: 初始化每个控制器时,对多个控制器使用相同的 NIB 文件应该没有问题。不过,您通常不会从控制器内加载控制器自己的 nib 文件。
如果您使用 loadNibNamed::: 加载 nib 文件,那么您将获得一个 NSArray,其中包含其中定义的对象,因此您不能直接将其用作视图。获取视图的一种方法是使用 for() 或其他方法搜索数组以找到所需的对象,但如果设置owner:self,那么它应该连接到与 self 中的文件所有者相连的插座,因为文件所有者将是 self 。但在这种情况下你可以丢弃返回值;您不需要返回的数组。如果您连接了该插座,这可能是您的主要问题(用阵列破坏插座)。
可以使用 loadNibNamed 加载特定的视图对象(假设您从返回的数组中选择它),然后以某种方式显示它,但通常在控制器上使用 initWithNibName 更容易(在这种情况下,文件的所有者将是控制器) 。
哦,您还可以在 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;
Run Code Online (Sandbox Code Playgroud)
(摘自《开始 iPhone 3 开发》示例代码中的第 8 章:Cells 2。 )
您可以使用 IB 中的出口来执行此操作,在这种情况下,您可以省略 for 循环,但您可能需要为声明出口的两个控制器提供一个超类,并告诉 Interface Builder 文件的所有者是该超类的实例所以它知道插座。可能不值得这么麻烦。
| 归档时间: |
|
| 查看次数: |
3343 次 |
| 最近记录: |