InterfaceBuilder中的UITableViewHeaderFooterView

时间:2013-07-15 10:18:25

标签: cocoa-touch uitableview

我想使用IB

在单独的.xib中创建自定义标题剖面视图

然而在IB中我找不到组件UITableViewHeaderFooterView(类似于UITableViewCell)并为其分配重用

那么如何在自定义标题部分创建?

我创建了一个继承自UITableViewHeaderFooterView的类MySection 创建.xib,MySection.xib 注册xib以进行单元重用

问题是,如何使用initWitReuseIdentifier ....

9 个答案:

答案 0 :(得分:64)

这绝对是可能的,Apple提供了一个示例here

下载示例代码并查看SectionHeaderView.xib。

这样做的方法是创建一个带有单个UIView的xib。然后,将类类型设置为从UITableViewHeaderFooterView继承的类。

一旦你有一个继承自UITableViewHeaderFooterView的类的nib,请调用以下命令将该类重新注册为页眉或页脚:

static NSString * const SectionHeaderViewIdentifier = @"SectionHeaderViewIdentifier";

[self.tableView registerNib:[UINib nibWithNibName:@"SectionHeaderView" bundle:nil] forHeaderFooterViewReuseIdentifier:SectionHeaderViewIdentifier];

要使用视图,请实现表委托方法tableView:viewForHeaderInSection:如:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSinteger)section {

    SectionHeaderViewClass *sectionHeaderView = (SectionHeaderView *)[tableView dequeueReusableHeaderFooterViewWithIdentifier:SectionHeaderViewIdentifier];

    // Do stuff...

    return sectionHeaderView;
}

答案 1 :(得分:13)

我写了guide(在iOS 9上测试过),包含4个步骤:

  1. 子类UITableViewHeaderFooterView
  2. 使用子类视图创建Nib,并添加1个容器视图,其中包含页眉/页脚中的所有其他视图
  3. viewDidLoad中,为表格视图调用registerNib:forHeaderFooterViewReuseIdentifier:
  4. 实施viewForHeaderInSection并使用dequeueReusableHeaderFooterViewWithIdentifier取回页眉/页脚

答案 2 :(得分:2)

通过以下解决方法,我可以将IB项目拖动到代码作为变量。 UITableViewHeaderFooterView不允许开箱即用。

  1. 创建(新文件/ CocoaTouchClass) UITableViewHeaderFooterView .h.m.xib通常

  2. 暂时 将超类 从UITableViewHeaderFooterView重命名为UIView。拖动 - 根据需要将UI项目分配给代码,IB将分配键值 正确的,完成后还原为UITableViewHeaderFooterView。

  3. 在您的tableview中
  4. ,使用 registerNib:来注册而不是 registerClass:。通常准备其余的tableview(即:dequeue)。

答案 3 :(得分:1)

足以创建视图并在IB中分配其类(重用标识符不需要在接口构建器中设置(如通过自定义UITableViewCell))

答案 4 :(得分:0)

UITableViewHeaderFooterView文档包含registerNib:forHeaderFooterViewReuseIdentifier:方法

但是目前(截至2013年9月4日)Interface Builder中的对象库没有包含UITableViewHeaderFooterView。 这使得registerNib:forHeaderFooterViewReuseIdentifier:无用,因为无法在nib中正确配置视图。 也许最好尝试重复使用细胞...

答案 5 :(得分:0)

  1. 在xib中创建新视图

  2. 从nib加载视图并设置为以footerview的形式查看到tableview

  3. UIView * headerview = [[[NSBundle mainBundle] loadNibNamed:@“ReguistrationHeaderView”owner:self options:nil] firstObject];     [self.tableview setTableFooterView:headerview];

答案 6 :(得分:0)

我总是使用UITableViewCell作为表格的页眉(或页脚),以便能够直接在故事板中编辑它们。

我的工作流程:

  • 我创建了一个MyHeaderTableViewCell类子类化UITableViewCell并添加了我需要的所有插座
  • 我在故事板中为我的表添加了一个UITableViewCell
  • 我给它一个重用标识符(es:" HeaderCell")
  • 我将单元格出列并将其内容用作我的标题

关键部分是返回headerCell的contentView(而不是headerCell本身),否则在使用reloadRowsAt或类似函数(最多消失标题)时会遇到奇怪的行为。

这是我的代码:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let headerCell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell") as! MyHeaderTableViewCell

    headerCell.lblTitle.text = "My Title"

    return headerCell.contentView }

我从未遇到过这样的问题(或者至少我的客户总是付钱给我)。

答案 7 :(得分:0)

尽管所有这些答案都有效,但它们并未完全解决如何使用Interface Builder设置reuseIdentifier的原始问题。实际上,借助“用户定义的运行时属性”是可能的。您可以使用属性直接在Interface Builder中设置reuseIdentifier

Interface Builder user-defined runtime attributes

执行此操作将与reuseIdentifier Interface Builder属性检查器中的本机UITableViewCell字段完成完全相同的操作。

答案 8 :(得分:0)

从iOS 8开始,UITableHeaderFooterView的子视图应位于容器视图中,并且您不应在页眉/页脚视图中设置背景。对象库缺少UITableHeaderFooterView,因此我尝试了在xib中创建一个UIView并将另一个添加为Container View的方法。我担心的是,UITableHeaderFooterView上没有内容视图出口,而且我不确定我的内容视图实际上最终会成为内容视图。

这听起来像是黑客入侵或API滥用,但是这种方法对我没有任何警告或问题:

  1. 创建UITableHeaderFooterView的子类
  2. 为此创建一个空的xib
  3. 从对象库中拖动UITableViewCell
  4. 将UITableHeaderFooterView的类分配给该单元格
  5. 分配重用标识符

我想知道这种方法的任何(潜在)问题,请发表评论。