5

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

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

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

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

但是,当我运行该应用程序时,该单元格仅显示为一个空白单元格。对其进行一些检查,我发现它[myCell isKindOfClass:[MyEditableTableViewCell class]]返回 true。但是,UITextField似乎永远不会被实例化。当我尝试改变myCell.detailTextField.text时,什么都没有发生,并且myCell.detailTextField似乎为零。

任何帮助,将不胜感激!

4

2 回答 2

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.

于 2013-07-15T00:19:34.623 回答
0

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

- (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 对象更容易。

于 2018-04-01T17:36:18.440 回答