【问题标题】:Best way to create custom UITableview section header in storyboard在情节提要中创建自定义 UITableview 部分标题的最佳方法
【发布时间】:2015-02-19 01:33:06
【问题描述】:

当前我正在情节提要中创建一个原型单元格并将此单元格用作节标题。 在 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.

}  

【问题讨论】:

标签: ios objective-c uitableview


【解决方案1】:

原型单元格表视图只允许您在情节提要编辑器中设计单元格,而不是部分页眉和页脚。您尝试使用UITableViewCell 作为节标题是一种巧妙的技巧,但所涉及的类不支持它—UITableViewCell 并非设计用于除表格视图单元格之外的任何内容。它可能比视图消失或布局不正确更糟糕; UIKit 完全有权拒绝断言、删除所有应用程序的数据、撤销您的开发者证书或放火烧房子。

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

【讨论】:

  • 好的,我创建了一个带有标题视图的 XIB 文件。我为这些视图分配了自定义类,并从 viewForHeaderInSection: 方法内部将这些视图作为标题视图返回。现在这些标题视图正在自动释放。我该怎么办?我可以看到它们,但一旦我向他们发送任何消息,我就会收到“发送无法识别的选择器”错误。
  • @devgr 您需要编辑您的问题以包含您现在使用的代码,以便我们可以看到您在做什么。
  • 如果您需要在节标题上创建一个segue(例如点击它以显示另一个视图控制器),那么一个很大的问题是。然后在故事板中,两个视图控制器没有链接,因为您需要一个源“事物”来创建转场。
  • 我试过Michael Voznesensky's approach,它似乎工作。
【解决方案2】:

我遇到了同样的问题,解决方法是返回单元格的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;
}  

您会得到与以前相同的自动布局结果,但不会消失。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 但是部分标题应该UITableViewHeaderFooterView的实例
    • @adib,这不是必需的。看看 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 方法。
    • 但你需要wrap it in another UIView 否则表格视图可能会弄乱它。
    • 虽然他们会触发didSelectedRowAtIndexPath
    【解决方案4】:

    在 iOS 8 中,这真的很简单。只需像设计单元格一样设计标题即可。一切都一样,你可以放自定义类,不要忘记添加重用标识符。

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

    如果您想使用固定高度,请不要忘记实现tableView:heightForHeaderInSection,如果高度取决于单元格固有大小,请不要忘记实现tableView:estimatedHeightForHeaderInSection

    【讨论】:

    • 非常感谢!我实际上使问题复杂化,因为该方法需要一个 UIView 而不是单元格,然后在查看您的答案后,我只检查了 UITableViewCell 类并对其进行了测试。在我身边工作,非常感谢您
    • 你读过这个问题吗?他做同样的事情,如果你这样做,那么你的 header-cell 将消失,因为 tableView 认为它没有被使用,所以它重用它。
    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 2013-03-14
    • 2023-03-14
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多