2013-10-03 23 views
24

经过多年避免Interface Builder的瘟疫,我决定给它一个机会。这并不容易。UITableViewHeaderFooterView与IB

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

我们应该如何使用Interface Builder创建一个UITableViewHeaderFooterView,其内容为contentViewregisterNib:forHeaderFooterViewReuseIdentifier:存在的事实让我觉得这应该是可能的。

回答

30

这是我定义具有IB一个UITableViewHeaderFooterView最接近:

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

b。仅为contentView创建一个笔尖文件(MYTableViewHeaderFooterContentView)。

c。在MYTableViewHeaderFooterView中重写initWithReuseIdentifier:以加载在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类,而不是笔尖文件:

[self.tableView registerClass:[MYTableViewHeaderFooterView class] forHeaderFooterViewReuseIdentifier:@"cell"]; 
+0

这是在iOS 6和iOS 8 –

+0

工作'contentViewSize'是{0,0,0,0} – john07

+6

这实际上是不必要的和苹果有一些示例代码来证明这一点。链接这个问题的新人http://stackoverflow.com/a/20073742/1652402 –

25

我只是一个页脚和一个NIB文件这样做:

  1. 创建名为CustomFooterView.xib空NIB文件。
  2. 编辑Interface Builder中的NIB文件,并将最上面的UIView自定义类更改为UITableViewHeaderFooterView。
  3. 禁用自动布局在NIB。
  4. 设置UITableViewHeaderFooterView视图的背景颜色为默认
  5. 使视图的自由形式和正确的大小(例如320 x 44)。
  6. 在你的UITableViewController viewDidLoad注册NIB文件与复用标识来使用:

    [self.tableView registerNib:[UINib nibWithNibName:@"CustomFooterView" bundle:nil] forHeaderFooterViewReuseIdentifier:@"Footer"]; 
    
  7. 在你的UITableViewController的tableView:viewForFooterInSection:使用页脚标识符提取和返回的观点:

    - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section 
    { 
        if (section == 2) 
         return [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"Footer"]; 
    
        return nil; 
    } 
    
+3

伟大的作品,虽然我不得不再做两件事来实现它:1.禁用NIB的自动布局。 2.将NIB中“UITableViewHeaderFooterView”视图的背景颜色设置为“默认”。 – Frederik

+0

谢谢@Frederik,我根据这个更新了答案。 –

+1

我认为这是更好的解决方案,因为您可以在此xib中连接插座,而在其他解决方案中则无法连接 – JonEasy

7

我发现更简单的方法。

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

2)从UITableViewCell的头文件中的变化超到UITableViewHeaderFooterView

就是这样。

+5

至少,这似乎不适用于XCode 6.4。当你尝试在IB中改变班级时,它不会完成(一个好兆头,事情出错了)。如果您单击并返回,它将恢复为“UITableViewCell”。如果查看Nib的对象列表,将显示一个“UITableViewCell”。当你尝试加载时,当头被卸载时出现断言,这是一种错误的类型:''为标识符注册的无效nib(sectionHeader) - nib必须包含一个顶级对象,它必须是一个UITableViewHeaderFooterView实例'' – Benjohn

9

只需在IB中使用UITableViewCell模板即可。将类更改为UITableViewHeaderFooterView。在这里,你有它...与一个contentView。

+0

这是最好的解决方案! – user3378170

0

我发现一个可怕的黑客攻击是在你的headerFooter类中创建一个IBOutlet contentView,并将它连接到xib中的“内容视图”(让你的xib像tableViewCell,View-> contentView->我的东西)。

你会得到警告,好准备下锅......

删除IBOutlet中,它会所有的工作。

0

我也经历了上述的废弃警告和无法设置背景颜色,等等。最后,我发现,按照苹果的文档,

您可以使用[在UITableViewHeaderFooter]类的,是不在大多数情况下都是子类。如果您要显示自定义内容,请为您的内容创建子视图,并将其添加到contentView属性中的视图中。

按照这一建议,我把这些步骤:

  1. 我创建了厦门国际银行与仅延伸UIView的一个观点 - 不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

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 
    } 
    
1

以下变通使我拖分配IB项目的代码作为变量。 UITableViewHeaderFooterView不允许开箱即用。

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

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

  3. 在您的tableview中,使用registerNib:注册而不是注册类别:。通常准备tableview的其余部分(即:出列)。