3

我是 iOS 开发的新手,我在理解文件所有者逻辑时遇到了问题。

我有这种情况:

我有两个视图(View_iPad、View_iPhone)和它们的控制器(ViewController_iPad、ViewController_iPhone)。基于启动应用程序的设备,使用特定的视图及其控制器。然后,我将 xib 文件中的子视图添加到此视图(使用 iPad 或 iPhone 视图无关紧要)。假设这个子视图在 iPad 和 iPhone 视图中的位置不同。这个子视图包含一些标签,所以我必须在子视图控制器中创建 IBoulets。

如果我理解,根据苹果的逻辑,视图的文件所有者是一个控制器(可以访问该视图并可以与之通信的文件)。所以 3 个视图(iPhone、iPad、子视图)中的每一个都有自己的控制器,这意味着这些控制器是这些视图的文件所有者。

但是当我用代码加载子视图时:

     NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"subview" owner:self options:nil];

并将其作为子视图添加到 iPad/iPhone 视图,存在问题,因为此子视图包含标签的 IBOutlets,并且此标签位于子视图控制器中,而不是 iPhone/iPad 控制器中。

然后显示此错误:

由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[<__NSCFConstantString 0x7ab4> setValue:forUndefinedKey:]:此类与键视图的键值编码不兼容。”

我该如何解决这个问题?我试图将 @"subviewController" 作为所有者,但它没有帮助。谢谢你。

编辑!!: 所以我试图解决这个问题,但它仍然不起作用。这是一个新的情况:

子视图控制器是子视图的所有者,但根视图的自定义类是一个包含插座的类(从 UIView 派生)。

如果我有 iPad/iPhone 控制器所有者:@"subviewController",我得到这个错误:

由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[<__NSObject 0x715bf30> setValue:forUndefinedKey:]:此类与键视图的键值编码不兼容。”

视图是子视图控制器的属性。现在告诉我问题出在哪里。我真的很绝望!

或者,如果我有所有者:自我,则会打开一些带有说明的窗口,并出现 EXC_BAD_ACCESS 错误。

4

2 回答 2

3

所以首先,如果你有一个从 xib/storyboard 创建的视图控制器,那么视图控制器就是owns他的视图。如果您使用 xib 文件创建自定义视图,则文件所有者将是自定义类(UIView 的子类)但是当您使用 xib 文件创建自定义视图时,您必须将 IBOutlest 链接到 UIView 而不是像您这样的文件所有者当你有一个视图控制器时正在做。

其次,您的问题不是由owner错误链接的插座生成的问题 si 产生的,可能您将视图链接到字符串插座,因此请检查您的所有插座及其相应的视图。

于 2013-05-16T12:25:10.760 回答
2

Xcode 的类似 Interface Builder 的部分中的 File's Owner 图标(因为 IB 不再单独存在)是加载 nib 时指定为所有者的对象的代理。通常,这是加载 nib 的对象,通常是应用程序或视图控制器。

当你说:

NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"subview" owner:self options:nil];

那么文件的所有者将是self上面一行中的任何对象。如果您希望将包含上述行的对象以外的对象作为所有者,请在owner:参数中指定该对象。

于 2013-05-16T12:22:09.827 回答