在故事板中使用自定义静态表视图单元格XIB

时间:2013-07-14 23:44:21

标签: uitableview xib uistoryboard custom-cell

我有一个自定义静态UITableViewCell我希望看起来与右侧详细信息单元格完全相同(左侧是UILabel,右侧是UILabel),除了我想要的右UILabel是可编辑的UITextField。由于我想在故事板中的多个视图控制器中使用此单元格,我认为最好的选择是创建 MyEditableTableViewCell.xib 文件,以及相应的* .h,m 文件。我在 MyEditableTableViewCell.h 中有两个公共属性:

@property (weak, nonatomic) IBOutlet UILabel *textLabel;
@property (weak, nonatomic) IBOutlet UITextField *detailTextField;

这些IBOutlet已连接到.xib文件中的UILabelUITextField。在我的故事板中,我有一个自定义UITableViewController子类,我将必要的UITableViewCell的类更改为MyEditableTableViewCell。我的视图控制器中有一个属性:

@property (weak, nonatomic) IBOutlet MyEditableTableViewCell *myCell;

然而,当我运行应用程序时,单元格显示为一个空白单元格。对它运行一些检查,我看到[myCell isKindOfClass:[MyEditableTableViewCell class]]返回true。但是,UITextField似乎永远不会被实例化。当我尝试改变myCell.detailTextField.text时,没有任何反应,myCell.detailTextField似乎是零。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:8)

您如何创建MyEditableTableViewCell的实例?我的猜测是你正在做[[MyEditableTableViewCell alloc] init]而不是从笔尖加载它们。

您的视图控制器中不需要该属性。您需要使用-[UITableView registerNib:forCellReuseIdentifier:]在表格视图中注册单元格笔尖。在viewDidLoad中执行此操作。然后,当您将dequeueReusableCellWithIdentifier:发送到表视图时,它将实例化nib,创建一个MyEditableTableViewCell,并将其返回给您。

更新

如果您在故事板中布置静态单元格,则使用xib布置单元格有点困难。最简单的方法就是在故事板中布置单元格的子视图。如果您有一些相同的类型,可以将子视图复制并粘贴到每个单元格。

如果您真的想使用xib,最简单的方法是构建单元格的视图层次结构,如下所示:

MyEditableTableViewCell (in storyboard)
|
+- cell's content view (created automatically by UIKit)
   |
   +- UIView (top-level view of the xib)
      |
      +- UILabel (textLabel)
      |
      +- UITextField (detailTextField)

因此,您将故事板中的单元格类设置为MyEditableTableViewCell。然后你创建你的xib。您将xib文件的所有者类设置为MyEditableTableViewCell。 xib 包含MyEditableTableViewCell。 xib的顶级视图只是一个普通的UIView,包含子视图(标签和文本字段)。

-[MyEditableTableViewCell initWithCoder:]中,在执行self = [super initWithCoder:aDecoder]后,实例化xib,将self(单元格)作为xib文件的所有者传递。单元格可以有出口连接到标签和xib中的文本字段。

在实例化xib后,将xib中的顶级视图添加为self.contentView的子视图。如果您正在使用自动布局,请在顶级视图和内容视图之间创建约束。否则,请将顶级视图的frame设置为内容视图的bounds,并将自动调整模板设置为UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight

答案 1 :(得分:0)

虽然静态表视图不会从笔尖中获取您的单元格,但它仍然会调用cellForRowAtIndexPath。在那里,您可以出列并返回完全未归档的自定义单元格。可以通过在cellForRowAtIndexPath上调用super来获取在IB中设置的自定义单元格上的属性:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // get an empty cell with properties retained from IB
    UITableViewCell *sup = [super tableView:tableView cellForRowAtIndexPath:indexPath];

    if ([sup isKindOfClass:[MyCustomCell class]]) {
          // fetch a fully unarchived cell
          MyCustomCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"foo" forIndexPath:indexPath];

          // copy properties over...
          [cell copyPropertiesFromCell:(MyCustomCell *)sup];

          return cell;
    }
    return sup;
}

根据具体情况,这可能比弄脏IB对象更容易。