带IB的UITableViewHeaderFooterView

hpi*_*que 24 interface-builder uitableview ios

经过多年避免瘟疫之类的Interface Builder,我决定给它一个机会.这是不容易的.

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

我们如何使用Interface Builder创建UITableViewHeaderFooterView内容中的内容contentViewregisterNib:forHeaderFooterViewReuseIdentifier:存在的事实使我认为这应该是某种可能的.

hpi*_*que 31

这是我最接近UITableViewHeaderFooterViewIB的定义:

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

湾 为contentViewonly(MYTableViewHeaderFooterContentView)创建一个nib文件.

C.覆盖initWithReuseIdentifier:MYTableViewHeaderFooterView加载在笔尖文件中定义的图.

 - (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;
}
Run Code Online (Sandbox Code Playgroud)

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

[self.tableView registerClass:[MYTableViewHeaderFooterView class] forHeaderFooterViewReuseIdentifier:@"cell"];
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是不必要的,苹果有一些示例代码来证明这一点.将这个问题链接到新手http://stackoverflow.com/a/20073742/1652402 (6认同)

Mar*_*uro 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"];
    
    Run Code Online (Sandbox Code Playgroud)
  7. 在你的UITableViewController中tableView:viewForFooterInSection:使用Footer标识符来获取并返回视图:

    - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
    {
        if (section == 2)
            return [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"Footer"];
    
        return nil; 
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 虽然我必须做两件事才能使其工作,但效果很好:1.禁用NIB的自动布局.2.将NIB中"UITableViewHeaderFooterView"视图的背景颜色设置为"Default". (3认同)

小智 13

只需在IB中使用UITableViewCell模板即可.将类更改为UITableViewHeaderFooterView.在这里你有...带有contentView.


mdz*_*iec 7

我发现更简单的方法.

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

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

而已.

  • 至少,这似乎不适用于XCode 6.4.当你试图改变IB中的类时,它没有完成(一个好的迹象就是出错了).如果你单击并返回,它将恢复为"UITableViewCell".如果你查看Nib的对象列表,会显示一个`UITableViewCell`.当您尝试加载时,如果标题出现错误,则会触发断言:`'为标识符注册的无效nib(sectionHeader) - nib必须只包含一个顶级对象,该对象必须是UITableViewHeaderFooterView实例' (5认同)

phe*_*sta 6

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

  1. 创建一个子类UIView("AwesomeHeaderView")并创建出口的新类:

    class AwesomeHeaderView: UIView {
        @IBOutlet var myCustomLabel: UILabel!
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用UIView作为父视图创建XIB文件("MyNewHeader.xib").将父UIView的类类型更改为新创建的自定义类("AwesomeHeaderView").根据需要,添加任何其他视图,因为它的子项和链接出口等.(注意:为确保视图符合新的可读内容指南,请选中所有对象上的"保留Superview边距"和"跟随可读宽度"框).
  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
    }
    
    Run Code Online (Sandbox Code Playgroud)