经过多年避免瘟疫之类的Interface Builder后,我决定给它一个机会。这不容易。
以UITableViewHeaderFooterView
为例。与UITableViewCell
一样,它具有contentView
属性。与UITableViewCell
不同,它在Interface Builder对象库中没有模板。
我们如何使用Interface Builder创建UITableViewHeaderFooterView
内容为contentView
的内容? registerNib:forHeaderFooterViewReuseIdentifier:
存在的事实使我认为这应该是可能的。
答案 0 :(得分:30)
这是我用IB定义UITableViewHeaderFooterView
的最接近的地方:
一个。创建一个UITableViewHeaderFooterView
子类(MYTableViewHeaderFooterView
)。
湾仅为contentView
创建一个nib文件(MYTableViewHeaderFooterContentView
)。
℃。覆盖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"];
答案 1 :(得分:25)
我只是使用页脚和NIB文件执行此操作:
UITableViewHeaderFooterView
视图的背景颜色设置为默认。在UITableViewController viewDidLoad
中注册要与重用标识符一起使用的NIB文件:
[self.tableView registerNib:[UINib nibWithNibName:@"CustomFooterView" bundle:nil] forHeaderFooterViewReuseIdentifier:@"Footer"];
在您的UITableViewController的tableView:viewForFooterInSection:
中使用页脚标识符来获取并返回视图:
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
if (section == 2)
return [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"Footer"];
return nil;
}
答案 2 :(得分:13)
只需在IB中使用 UITableViewCell 模板即可。将类更改为 UITableViewHeaderFooterView 。在这里你有...带有contentView。
答案 3 :(得分:7)
我找到了更简单的方法。
1)创建UITableViewCell的子类并设置你的xib文件
2)在头文件中将超类从UITableViewCell更改为UITableViewHeaderFooterView
那就是它。
答案 4 :(得分:6)
此解决方案效果很好,特别是如果您希望它与可读内容指南(在iOS 9中引入)相关的话。它不是创建UITableViewHeaderFooterView,而是在需要时返回自定义UIView(来自XIB):
创建一个新类,该类继承UIView(“AwesomeHeaderView”)并创建您的网点:
class AwesomeHeaderView: UIView {
@IBOutlet var myCustomLabel: UILabel!
}
在你的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
}
答案 5 :(得分:1)
我也遇到过上面的弃用警告,无法设置背景颜色等。最后,我发现根据Apple的文档,
在大多数情况下,您可以按原样使用[UITableViewHeaderFooter]类,而不进行子类化。如果要显示自定义内容,请创建内容的子视图,并将其添加到contentView属性中的视图。
根据该建议,我采取了以下步骤:
在viewDidLoad中我注册了内置的UITableViewHeaderFooter类
tableView.registerClass(UITableViewHeaderFooterView.self,forHeaderFooterViewReuseIdentifier:" sectionHeader")
在我的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 = "..."
这似乎有效,可以利用重用,并且不会产生任何警告。
答案 6 :(得分:1)
通过以下解决方法,我可以将IB项目拖动到代码作为变量。 UITableViewHeaderFooterView不允许开箱即用。
创建(新文件/ CocoaTouchClass) UITableViewHeaderFooterView .h.m.xib通常
暂时 将超类 从UITableViewHeaderFooterView重命名为UIView。拖动 - 根据需要将UI项目分配给代码,IB将分配键值 正确的,完成后还原为UITableViewHeaderFooterView。
答案 7 :(得分:0)
我想到的一个糟糕的黑客是创建一个IBOutlet contentView你的headerFooter类并将其连接到xib中的“内容视图”(让你的xib像tableViewCell一样布局,View-> contentView-&gt ;的MyStuff)
你会收到警告,准备好进行黑客攻击......
删除IBOutlet,它一切正常。