41

我想使用 IB 在单独的 .xib 中创建自定义标题部分视图

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

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

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

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

4

9 回答 9

70

这是绝对可能的,Apple在这里提供了一个例子。

下载示例代码并查看 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;
}
于 2013-11-19T14:09:32.170 回答
20

我写了一个指南(在 iOS 9 上测试),包括 4 个步骤:

  1. 子类UITableViewHeaderFooterView
  2. 使用子类视图创建 Nib,并在页眉/页脚中添加 1 个包含所有其他视图的容器视图
  3. viewDidLoad,调用registerNib:forHeaderFooterViewReuseIdentifier:表格视图
  4. 实现viewForHeaderInSection并用于dequeueReusableHeaderFooterViewWithIdentifier取回页眉/页脚
于 2015-11-07T11:14:00.810 回答
5

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

Interface Builder 用户定义的运行时属性

这样做将完成与Interface Builder 属性检查器中的本地reuseIdentifier字段完全相同的事情。UITableViewCell

于 2018-11-20T21:20:20.033 回答
3

以下变通方法使我能够将 IB 项目作为变量拖放到代码中。UITableViewHeaderFooterView 不允许开箱即用。

  1. 正常创建(New File/CocoaTouchClass) UITableViewHeaderFooterView .hmxib

  2. 暂时将超类从 UITableViewHeaderFooterView重命名为 UIView。根据需要将您的 UI 项目拖放到代码中,IB 将正确分配键值,完成后恢复为 UITableViewHeaderFooterView。

  3. 在您的表格视图中,使用registerNib:来注册而不是registerClass:。正常准备其余的tableview(即:dequeue)。
于 2016-01-22T04:39:19.283 回答
0

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

于 2013-07-17T09:29:07.420 回答
0

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

这听起来像是 hack 或 API 误用,但是我没有遇到这种方法的警告或问题:

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

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

于 2020-09-07T06:20:22.890 回答
-1

UITableViewHeaderFooterView 文档包含registerNib:forHeaderFooterViewReuseIdentifier:方法

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

于 2013-09-04T17:40:14.373 回答
-1
  1. 在 xib 中创建新视图

  2. 从笔尖加载视图并设置为作为页脚视图查看到表格视图

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

于 2017-09-14T09:55:15.397 回答
-2

我总是使用 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 }

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

于 2018-02-09T10:48:37.660 回答