我是iOS开发的新手,我有理解文件所有者逻辑的问题。
我有这种情况:
我有两个视图(View_iPad,View_iPhone)及其控制器(ViewController_iPad,ViewController_iPhone)。基于启动app的设备,使用特定视图及其控制器。然后,我将xib文件中的子视图添加到此视图(如果使用iPad或iPhone视图则无关紧要)。假设这个子视图在iPad和iPhone视图中有不同的位置。此子视图包含一些标签,因此我必须在子视图控制器中创建IBOulets。
如果我理解,根据apple的逻辑,视图的文件所有者是一个控制器(可以访问此视图并可以与之通信的文件)。因此,3个视图(iPhone,iPad,subview)中的每一个都有自己的控制器,这意味着这些控制器是这些视图的文件所有者。
但是当我用代码加载子视图时:
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”,Igot这个错误:
由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[< __ NSObject 0x715bf30> setValue:forUndefinedKey:]:此类不是键视图的键值编码兼容。'
视图是子视图控制器的属性。现在告诉我问题出在哪里。我非常绝望!
或者如果我拥有所有者:self,则会打开一些带有说明的窗口,并显示EXC_BAD_ACCESS错误。
答案 0 :(得分:3)
首先,如果你有一个从xib / storyboard创建的视图控制器,那么视图控制器owns
就是他的视图。如果使用xib文件创建自定义视图,那么文件所有者将是自定义类(UIView的子类),但是当您使用xib文件创建自定义视图时,您必须将IBOutlest链接到UIView而不是像您一样链接到文件所有者你有一个视图控制器时正在做。
其次,问题不是由owner
由错误链接的插座产生的问题产生的,可能是您将视图链接到字符串的插座,因此请检查所有插座及其相应的视图。
答案 1 :(得分:2)
Xcode的Interface Builder类似部分中的文件所有者图标(因为IB不再单独存在)是加载nib时指定为所有者的对象的代理。通常,这是加载nib的对象,通常是应用程序或视图控制器。
当你说:
NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"subview" owner:self options:nil];
然后文件的所有者将是上面一行中的任何对象self
。如果您希望包含上述行的对象以外的对象为所有者,请在owner:
参数中指定该对象。