在故事板中创建自定义UITableview节头的最佳方法

时间:2014-12-20 05:58:40

标签: ios objective-c uitableview

当前我正在故事板中创建原型单元格并将此单元格用作节标题。 在tableView:viewForHeaderInSection:方法中,我将单元格出列并返回它。

我的节标题单元格中有一个UITextField和一个UIButton。 当我点击文本字段时会出现键盘,但只要焦点从文本字段移开,整个部分标题就会消失。 当我直接将单元格作为节标题视图返回时会发生这种情况,但是如果我将新分配的UIView作为节标题视图返回到哪个单元格作为子视图添加,那么除了自动调整掩码外,一切正常。

为什么标题会消失?

我不确定这里最好的东西是什么。

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    static NSString *CellIdentifier = @"SectionHeader"; 

SettingsTableViewCell *sectionHeaderCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    //return sectionHeaderCell; // returning cell directly, section header disappears when focus is moved away from text field.
UIView * headerView = [[UIView alloc] initWithFrame:sectionHeaderCell.frame];
[headerView addSubView:sectionHeaderCell];
return sectionHeaderCell;//header view never disappears, but auto resizing masks do not work. Need to know how to set autoresizing masks to headerView so that it resizes correctly.

}  

4 个答案:

答案 0 :(得分:21)

原型单元格表视图只允许您在情节提要编辑器中设计单元格,而不是节页眉和页脚。您尝试使用UITableViewCell作为节标题是一个聪明的黑客,但它只是不受所涉及的类支持 - UITableViewCell并非旨在用于除表之外的任何其他内容查看单元格。它可能比视图消失或没有正确布局更糟糕; UIKit将完全有权通过断言,删除所有应用程序的数据,撤销您的开发人员证书或让您的房子着火。

如果您希望代码正常运行,您可以选择在代码中创建节标题或将它们放在单独的XIB文件中。我知道那不是你想做的,但这些都是你的选择。

答案 1 :(得分:8)

我遇到了同样的问题,修复方法是返回单元格的contentView,如:

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
static NSString *CellIdentifier = @"SectionHeader"; 

   SettingsTableViewCell *sectionHeaderCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

   sectionHeaderCell.myPrettyLabel.text = @"Greetings";
   sectionHeaderCell.contentView.backgroundColor = [UIColor whiteColor]; // don't leave this transparent

   return sectionHeaderCell.contentView;
}  

你得到的结果和以前一样,但没有消失。

答案 2 :(得分:2)

我确信你可以使用UITableViewCell作为节头,因为UITableViewCell是UIView的子类,所以根据LSP

  

“程序中的对象应该可以用它们的实例替换   子类型没有改变该程序的正确性。“

答案 3 :(得分:2)

在iOS 8中,它非常简单。只需按照设计单元格的方式设计标题即可。一切都是一样的,你可以把自定义类放在一起,不要忘记添加重用标识符。

在代码中使用它时,只需在tableView:viewForHeaderInSection方法中返回该单元格。

如果您想使用修正高度,请不要忘记实施tableView:heightForHeaderInSection;如果高度取决于单元格的内在尺寸,请不要忘记tableView:estimatedHeightForHeaderInSection