【问题标题】:iOS who is file owner of subview?iOS 谁是子视图的文件所有者?
【发布时间】:2013-05-11 07:41:07
【问题描述】:

我是 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> setValue:forUndefinedKey:]:此类与键视图的键值编码不兼容。”

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

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

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

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

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

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

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

【问题讨论】:

  • 两个问题:1) `NSArray *nibContents = ` 行在哪个类中执行(即 self 的值是多少)和 2) 异常在哪里触发?要找出在 'throw' 上设置异常断点。
  • 1) 取决于启动应用程序的设备。 Self 是 ViewController_iPad 或 ViewController_iPhone。 2) 在 loadNibNamed 行中触发异常。

标签: ios subview iboutlet addsubview


【解决方案1】:

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

当你说:

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

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

【讨论】:

  • 好的,带有 loadNibNamed 的代码在 iPhone/iPad 控制器中。如果所有者设置为自己,则表示所有者是 iPhone/iPad 控制器。但是在这个控制器中,子视图中的标签没有 IBOutlets。正如我所写,我试图将所有者设置为 subviewController 而不是 self 但它没有帮助。而且我无法将 IBOutlets 放入 iPhone/iPad 控制器,因为这样我就无法将标签绑定到不同文件中的 IBOutlets。
  • 查看 nib 文件中的 File's Owner。检查器中文件所有者的类型是什么?您需要确保在加载 nib 时指定为所有者的对象是同一类型的对象。此外,您指定为文件所有者类型的任何类都需要具有view 属性,或者与密钥view 的KVC 兼容。这正是错误告诉您的内容:所有者对于名为 view 的密钥不符合 KVC。
【解决方案2】:

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

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

【讨论】:

  • 1) > 我必须绑定到哪个 UIView?在这种情况下,文件所有者是 subviewController,它包含出口,我只是将它们绑定到 IB 中的 UIViews
  • 2) > - 我不明白您所说的字符串是什么意思。我知道这是一个愚蠢的问题,但我是新手,仍然不明白这个问题。
猜你喜欢
  • 2013-08-11
  • 2013-12-02
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
相关资源
最近更新 更多