27

在像瘟疫一样避免使用 Interface Builder 多年之后,我决定给它一个机会。这并不容易。

举个UITableViewHeaderFooterView例子。就像UITableViewCell,它有一个contentView属性。与 不同UITableViewCell的是,它在 Interface Builder 对象库中没有模板。

我们应该如何使用 Interface Builder 来创建一个UITableViewHeaderFooterView里面的内容contentView?存在的事实registerNib:forHeaderFooterViewReuseIdentifier:使我认为这应该以某种方式成为可能。

4

9 回答 9

32

这是我UITableViewHeaderFooterView用 IB 定义的最接近的:

一个。创建一个UITableViewHeaderFooterView子类 ( MYTableViewHeaderFooterView)。

湾。contentView为唯一 ( MYTableViewHeaderFooterContentView)创建一个 nib 文件。

C。覆盖initWithReuseIdentifier:MYTableViewHeaderFooterView加载 nib 文件中定义的视图。

 - (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithReuseIdentifier:reuseIdentifier];
    if (self)
    {
        NSArray* objects = [[NSBundle mainBundle] loadNibNamed:@"MYTableViewHeaderFooterView"
                                                          owner:self
                                                        options:nil];
        UIView *nibView = [objects firstObject];
        UIView *contentView = self.contentView;
        CGSize contentViewSize = contentView.frame.size;
        nibView.frame = CGRectMake(0, 0, contentViewSize.width, contentViewSize.height);
        [contentView addSubview:nibView];
    }
    return self;
}

d。注册MYTableViewHeaderFooterView类而不是 nib 文件:

[self.tableView registerClass:[MYTableViewHeaderFooterView class] forHeaderFooterViewReuseIdentifier:@"cell"];
于 2013-10-03T15:16:12.643 回答
25

我只是用页脚和 NIB 文件做到了这一点:

  1. 创建一个名为CustomFooterView.xib的空 NIB 文件。
  2. 在 Interface Builder 中编辑 NIB 文件并将最顶层的 UIView 自定义类更改为 UITableViewHeaderFooterView。
  3. 在 NIB 中禁用自动布局。
  4. UITableViewHeaderFooterView视图的背景颜色设置为Default
  5. 使视图自由形式和正确大小(例如 320 x 44)。
  6. 在您的 UITableViewControllerviewDidLoad中注册要与重用标识符一起使用的 NIB 文件:

    [self.tableView registerNib:[UINib nibWithNibName:@"CustomFooterView" bundle:nil] forHeaderFooterViewReuseIdentifier:@"Footer"];
    
  7. 在您的 UITableViewController 中,tableView:viewForFooterInSection:使用 Footer 标识符来获取并返回视图:

    - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
    {
        if (section == 2)
            return [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"Footer"];
    
        return nil; 
    }
    
于 2013-10-28T12:27:19.470 回答
14

只需使用 IB 中的UITableViewCell模板。将类更改为UITableViewHeaderFooterView。在这里,您拥有它...带有 contentView。

于 2014-08-31T18:37:35.127 回答
7

我找到了更简单的方法。

1)创建 UITableViewCell 的子类并设置您的 xib 文件

2)在您的头文件中,将超类从 UITableViewCell 更改为 UITableViewHeaderFooterView

而已。

于 2014-08-27T11:00:25.760 回答
6

此解决方案运行良好,特别是如果您希望它与可读内容指南(在 iOS 9 中引入)相关的正常工作。它不是创建 UITableViewHeaderFooterView,而是在需要时简单地返回一个自定义 UIView(来自 XIB):

  1. 创建一个子类 UIView ("AwesomeHeaderView") 的新类并创建您的网点:

    class AwesomeHeaderView: UIView {
        @IBOutlet var myCustomLabel: UILabel!
    }
    
  2. 创建一个以UIView作为父视图的 XIB 文件(“MyNewHeader.xib”)。将父 UIView 的类类型更改为您新创建的自定义类(“AwesomeHeaderView”)。根据需要,添加任何其他视图,因为它是子视图和链接插座等。(注意:为确保视图符合新的可读内容指南,我选中了所有对象上的“保留超级视图边距”和“遵循可读宽度”框)。
  3. 在您的 UIViewController(或 UITableViewController)中调用以下内容:

    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        guard let headerView = NSBundle.mainBundle().loadNibNamed("MyNewHeader", owner: nil, options: nil).first as? AwesomeHeaderView else {
            return nil
        }
    
        // configure header as normal
        headerView.backgroundColor = UIColor.redColor()
        headerView.myCustomLabel.textColor = UIColor.whiteColor()
        headerView.myCustomLabel.text = "Hello"
    
        return header
    }
    
于 2016-01-14T05:21:07.390 回答
1

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

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

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

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

我也遇到了上面的弃用警告和无法设置背景颜色等。最终,我发现根据Apple的文档,

在大多数情况下,您可以按原样使用 [UITableViewHeaderFooter] 类而无需子类化。如果您有自定义内容要显示,请为您的内容创建子视图并将它们添加到 contentView 属性中的视图。

根据该建议,我采取了以下步骤:

  1. 我创建了一个带有仅扩展 UIView 的视图的 xib,而不是 UITableViewHeaderFooter。
  2. 在 viewDidLoad 我注册了内置的 UITableViewHeaderFooter 类

    tableView.registerClass(UITableViewHeaderFooterView.self, forHeaderFooterViewReuseIdentifier: "sectionHeader")

  3. 在我的 UITableViewController 的 viewForHeaderInSection 委托中,我通过该标识符将标题视图出列并检查标题视图是否已包含子视图。如果没有,我加载我的 xib 并添加它。然后我根据需要设置我的文本。

    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let header = self.tableView.dequeueReusableHeaderFooterViewWithIdentifier("sectionHeader")!
    
    if header.contentView.subviews.count == 0 { header.contentView.addSubview(loadMyNib()) }
    
    let myView = header.contentView.subviews[0] as! MyView
    myView.label.text = "..."
    

这似乎有效,利用了重用,并且不会产生任何警告。

https://developer.apple.com/library/prerelease/tvos/documentation/UIKit/Reference/UITableViewHeaderFooterView_class/index.html#//apple_ref/occ/instm/UITableViewHeaderFooterView/prepareForReuse

于 2015-10-22T05:54:46.673 回答
0

我发现的最好方法:

  1. 创建您的 HeaderFooterView(.h/.m),例如header
  2. 创建一个xib(view),同名
  3. 将根视图类作为您的类(header
  4. [重要] 将所有出口连接到根视图,而不是File's Owner

最后,将您的笔尖注册到表中(全部完成)。

于 2021-11-16T08:28:10.507 回答
0

我发现一个可怕的技巧是在你的 headerFooter 类中创建一个 IBOutlet contentView 并将其连接到 xib 中的“内容视图”(让你的 xib 像 tableViewCell、View->contentView->mystuff 一样布局)。

你会收到警告,准备好黑客攻击...

删除 IBOutlet 就可以了。

于 2015-10-07T16:13:06.453 回答