【问题标题】:Using Custom Static Table View Cell XIB in Storyboard在 Storyboard 中使用自定义静态表视图单元格 XIB
【发布时间】:2013-07-12 18:24:50
【问题描述】:

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

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

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

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

但是,当我运行该应用程序时,该单元格仅显示为一个空白单元格。对其进行一些检查,我看到 [myCell isKindOfClass:[MyEditableTableViewCell class]] 返回 true。但是,UITextField 似乎从未被实例化。当我尝试更改 myCell.detailTextField.text 时,没有任何反应,myCell.detailTextField 似乎为零。

任何帮助将不胜感激!

【问题讨论】:

    标签: uitableview xib uistoryboard custom-cell


    【解决方案1】:

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

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

    【讨论】:

    • 对不起,如果我不清楚,这些UITableViews 是静态的。 dequeueReusableCellWithIdentifier: 永远不会被调用,任何 UITableViewDataSource 方法也不会被调用。 MyEditableTableViewCell 直接放置在情节提要中的 UITableView 中。我确实需要视图控制器中的IBOutlet 属性,以便在运行时编辑其文本。
    • Rob 对此有何进一步建议?
    • 如果您在情节提要中使用静态表格视图单元格,则必须在情节提要中布置这些单元格。您不能将它们放在单独的 xib 中。
    • 那么就没有办法重用静态配置了吗?每次想用的时候都需要布置一下?如果是这种情况,请更新您的答案,我很乐意接受。
    • 对于迟到的评论,我深表歉意——但有没有解释为什么不能在单独的 xib 中布置单元格,然后将该 uitableview 的 xib 加载到静态表格视图中?我知道你不能这样做,但我真的很想知道为什么。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 2016-01-08
      • 2012-02-11
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      相关资源
      最近更新 更多