一个带有多个“文件所有者”的xib文件

时间:2011-05-01 15:28:07

标签: iphone ios uitableview xib reusability

我有三个不同的UITableView,每个都在它自己的视图中,通过标签访问。理想情况下,所有这三个表都共享相同的自定义UITableViewCell类和.xib文件。

我从一个表开始,将.xib的类设置为我的自定义类,将.xib的文件所有者设置为表的父UIViewController,这非常有效。所有与自定义视图相关的代码都在单元格的类中(基于控制器设置的属性的背景图像,基于标签根据控制器设置的单元属性所需的行数自定义单元格高度等)

结果很好:单元格负责所有可视布局并响应单元格控件上的用户操作,而视图控制器负责创建单元格并设置其数据。

现在我需要在其他表中重用该单元格,但是自定义单元格的.xib具有单个文件所有者这一事实是一个问题。而不是复制.xib文件,是否有一种允许多个控制器拥有它的简单方法?

3 个答案:

答案 0 :(得分:38)

nib的文件所有者未得到严格执行。相反,它仅用于确定可用的出口和操作,以及在Interface Builder中设置绑定。无论nib文件中设置的类如何,您都可以将任何对象的nib作为其文件所有者加载。加载nib时,它会向文件所有者发送消息以重新建立绑定。如果实际的文件所有者对象无法识别这些选择器,则会触发“无法识别的选择器”异常。这意味着如果您的笔尖将某些UITableViewCell绑定到其文件所有者的“单元格”出口,则任何具有“单元格”属性的对象都可以加载该笔尖。您只需要注意不要使用此行为来发送无法识别的选择器或意外的插座类。

在您的情况下,请考虑创建一个UIViewController子类,以充当您的笔尖的文件所有者。让三个现有控制器中的每一个都扩展该视图控制器子类。这样他们就可以继承nib文件所期望的同一组属性,并且在定义自己的自定义行为的同时安全地加载该nib。

答案 1 :(得分:4)

checked answerthis question讨论了从nib文件加载自定义表格单元格的两种方法,这些方法不需要将文件所有者设置为特定控制器。这些方法允许您重复使用不同所有者的单元格。

答案 2 :(得分:1)

A"分享"作为文件所有者的超类并不总是一个好的解决方案。 请记住,您始终可以在视图中加载xib,并在不使用插座的情况下建立连接,例如:

UIView *aView = [[NSBundle mainBundle] loadNibNamed:@"MyXibFile" owner:self options:nil]
//Search subviews by tag. Obviously you need to set the tag on your view in MyXibFile
UILabel *aLabel = (UILabel*)[aView viewWithTag:996]; 
UILabel *aTextField = (UITextField*)[aView viewWithTag:997]; 
aTextField.delegate = self;
//etc...

我不能说这是一个干净的解决方案,但在某些情况下可能比继承更好。