gpt4 book ai didi

iphone - 如何创建一个具有可由多个 ViewController 使用的关联 View 类的 Nib

转载 作者:行者123 更新时间:2023-12-03 16:11:46 26 4
gpt4 key购买 nike

我正在提出一个新问题来跟进我的上一个问题 ( superview and parentviewcontroller nil after adding a subview )。基本上我知道使用 subview 是一个好主意,但是我不应该让 ViewController 控制位于另一个 ViewController 内的 subview 。基本上我想做以下事情......我有两个 ViewController,它们共享一个公共(public) subview 。我已将该 subview 创建为名为 SearchDate.xib 的 Nib 。文件所有者是对应的类SearchDateView.m/h。该类有一个用于 Nib 中 UIView 内唯一元素的导出,即标签。 SearchDateView 类还有一个用于更改 SearchDateView.xib 中标签值的函数。我希望我的两个 ViewController 都加载这个 Nib ,但显然我不知道如何正确加载 Nib 。无论我做什么,最好的情况是没有任何显示,最坏的情况是抛出异常。苹果文档讨论了将 IB 中类的其他实例直接拖到主视图中,但这似乎不起作用。我的 ViewController 中有一个 SearchDateView 导出,我尝试在 Controller 的加载 View 上执行此操作:

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 、关联的 View 类(更新该 Nib 中的一些对象)并在不同的 Controller 中重用该 Nib 的正确方法是什么?

编辑:考虑到评论,这可能还不够清楚。我不想对整个 View 使用相同的 nib 文件,而是对 subview 使用相同的 nib 文件。例如, Controller A 有一个 map 和一个 SearchDateView, Controller B 有一个 TableView 和一个 SearchDateView。所以我想知道如何将 subview 加载到多个 Controller 中......

最佳答案

当使用 initWithNibName:bundle: 初始化每个 Controller 时,对多个 Controller 使用相同的 NIB 文件应该没有问题。不过,您通常不会从 Controller 内加载 Controller 自己的 nib 文件。

如果您使用 loadNibNamed:::加载 nib 文件,那么您将获得一个 NSArray,其中包含其中定义的对象,因此您不能直接将其用作 View 。获取 View 的一种方法是使用 for() 或其他方法搜索数组以找到所需的对象,但如果设置owner:self,那么它应该连接到与 self 中的文件所有者相连的 socket ,因为文件所有者将是 self 。但在这种情况下你可以丢弃返回值;您不需要返回的数组。如果您连接了该 socket ,这可能是您的主要问题(用阵列破坏 socket )。

可以使用 loadNibNamed 加载特定的 View 对象(假设您从返回的数组中选择它),然后以某种方式显示它,但通常在 Controller 上使用 initWithNibName 更容易(在这种情况下,文件的所有者将是 Controller )。

哦,您还可以在 Interface Builder 中设置 Controller 的 nib 文件。对多个 Controller 使用相同的 nib 应该不会有问题,因为本质上您只需告诉 Interface Builder 设置 nib 文件来执行 initWithNibNamed 之类的操作。单击 Controller 对象并检查检查器窗口。

更新

我可能会这样做,以便在多个 Controller 中仅使用一个 View :

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

(摘自第 8 章:开始 iPhone 3 开发示例代码中的 Cells 2。)

您可以使用 IB 中的导出来执行此操作,在这种情况下,您可以省略 for 循环,但您可能需要为声明导出的两个 Controller 提供一个父类(super class),并告诉 Interface Builder 文件所有者是一个实例该父类(super class)的所以它知道导出。可能不值得这么麻烦。

关于iphone - 如何创建一个具有可由多个 ViewController 使用的关联 View 类的 Nib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2066539/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com