以UITableViewHeaderFooterView为例,就像UITableViewCell一样,它有一个contentView属性。但不同的是,Interface Builder对象库中没有它的模板。
那么,我们该如何使用Interface Builder创建一个UITableViewHeaderFooterView,并将内容放在contentView中呢?registerNib:forHeaderFooterViewReuseIdentifier:的存在让我认为这应该是可能的。
这是我能做到的最接近通过IB定义UITableViewHeaderFooterView
的方法:
a. 创建一个UITableViewHeaderFooterView
子类(MYTableViewHeaderFooterView
)。
b. 仅为contentView
创建一个nib文件(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
类,而不是Nib文件:
[self.tableView registerClass:[MYTableViewHeaderFooterView class] forHeaderFooterViewReuseIdentifier:@"cell"];
我刚用底部视图和NIB文件完成了以下操作:
UITableViewHeaderFooterView
视图的背景颜色设置为默认。在UITableViewController的viewDidLoad
中注册要使用的带有复用标识符的NIB文件:
[self.tableView registerNib:[UINib nibWithNibName:@"CustomFooterView" bundle:nil] forHeaderFooterViewReuseIdentifier:@"Footer"];
在您的UITableViewController的tableView:viewForFooterInSection:
中使用Footer标识符来获取并返回视图: - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
if (section == 2)
return [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"Footer"];
return nil;
}
UITableViewHeaderFooterView
视图的背景颜色设置为“默认”。 - Frederik只需在IB中使用UITableViewCell模板。将类更改为UITableViewHeaderFooterView。这样您就可以得到一个带有contentView的表头或表尾视图。
Create a new class that subclasses UIView ("AwesomeHeaderView") and create your outlets:
class AwesomeHeaderView: UIView {
@IBOutlet var myCustomLabel: UILabel!
}
In your UIViewController (or UITableViewController) call the following:
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
}
在大多数情况下,您可以直接使用[UITableViewHeaderFooter]类而无需子类化。如果您有自定义内容要显示,请为其创建子视图并将其添加到contentView属性中。
按照这个建议,我采取了以下步骤:
In viewDidLoad I registered the built-in UITableViewHeaderFooter class
tableView.registerClass(UITableViewHeaderFooterView.self, forHeaderFooterViewReuseIdentifier: "sectionHeader")
In the viewForHeaderInSection delegate of my UITableViewController, I dequeued the header view by that identifier and checked to see if the header view already contained a subview. If not, I load my xib and add it. Then I set my text as needed.
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 = "..."
我找到的最好方法:
header
header
)File's Owner
最后,将您的nib注册到table中(完成)。
contentViewSize
是 {0,0,0,0}。 - john07