不使用tableView更改UITableView节头:titleForHeaderInSection

时间:2009-10-19 00:14:47

标签: iphone uitableview

当我选择该部分的单元格时,我正在尝试更改UITableView中某个部分的标题标题。 tableView:titleForHeaderInSection由应用程序触发,因此无济于事。我可以调用reloadData,但性能会受到影响,因为应用程序必须重新加载所有可见的单元格。我也尝试使用自定义标头,但这也会导致一些性能问题。

有没有办法获取默认标题视图使用的UILabel句柄并手动更改其文本?

谢谢!

9 个答案:

答案 0 :(得分:23)

调用[tableView endUpdates]可能会提供所需的结果而不会影响性能。

[self.tableView beginUpdates];
[self.tableView endUpdates];

// forces the tableView to ask its delegate/datasource the following:
//   numberOfSectionsInTableView:
//   tableView:titleForHeaderInSection:
//   tableView:titleForFooterInSection:
//   tableView:viewForHeaderInSection:
//   tableView:viewForFooterInSection:
//   tableView:heightForHeaderInSection:
//   tableView:heightForFooterInSection:
//   tableView:numberOfRowsInSection:

答案 1 :(得分:15)

使用:

[self.tableView headerViewForSection:i]

您可以获取第i部分的视图,然后手动“更新”它

如果您的视图只是自动生成的标签,这甚至可以工作,但您必须自己调整大小。 所以,如果你试图:

[self.tableView headerViewForSection:i].textLabel.text = [self tableView:self.tableView titleForHeaderInSection:i];

您将设置文本,但不会设置标签大小。你可以从NSString获得所需的大小来自己设置:

[label.text sizeWithFont:label.font];

答案 2 :(得分:13)

似乎没有任何标准API可用于访问系统提供的节标题视图。您是否尝试过更具针对性的reloadSections:withRowAnimation来让UIKit显示新的标题文本?

您在自定义部分标题视图中看到了哪些性能问题?我怀疑标准的不仅仅是UILabel

答案 3 :(得分:4)

您可以直接设置节标题标题的标题。例如,要设置零部分的标题:

UITableViewHeaderFooterView *sectionZeroHeader = [self.tableView headerViewForSection:0];
NSString *sectionZeroLabel = @"Section Zero";
[sectionZeroHeader.textLabel setText:[sectionZeroLabel uppercaseString]];
[sectionZeroHeader setNeedsLayout];

确保告诉部分标题视图它需要布局,否则新文本可能会被截断。此外,部分标签通常都是大写的。

答案 4 :(得分:1)

由于UITableView没有对节头视图进行入队和出列以便重用,因此您还可以查看是否可以将所有节头视图存储在内存中。请注意,您必须使用背景等创建自己的节标题视图才能执行此操作,但它可以让您获得更多的灵活性和功能。

您还可以尝试标记节标题视图(还需要您创建自己的节标题视图),并根据需要从tableview中抓取它们。

答案 5 :(得分:0)

这是一个WAG,我可以想出很多可能无法工作的原因,但是你不能遍历子视图,找到你想要的那个? E.g。

for (UIView *v in self.tableView.subviews) {
    // ... is this the one?
}

答案 6 :(得分:0)

其中一个解决方案是管理包含标签引用的多个节头的外部数组,并在外部更新它们。

答案 7 :(得分:0)

为了完整起见,我们都在寻找的方法是这个私有API,它的命名完全符合您的期望:

-(void)_reloadSectionHeaderFooters:withRowAnimation:

例如:

[tableView _reloadSectionHeaderFooters:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationAutomatic]

但我建议不要使用此功能。

答案 8 :(得分:0)

如果只想更新一个部分,最好的方法是tableView.headerView。如果标题不可见,则返回nil,因此不会加载额外的标题。

if let header = tableView.headerView(forSection: i) {
    header.textLabel!.text = "new title"
    header.setNeedLayout()
}

如果要更新所有可见的节标题,最好在显示视图之前将标题标签设置为节,并在需要时枚举子视图:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    view.tag = section
    // additional customization
}

func udpateVisibleSectionHeaders() {
    for subview in tableView.subviews {
        if let header = subview as? UITableViewHeaderFooterView {
            let section = header.tag
            header.textLabel!.text = "new title"
            header.setNeedsLayout()
        }
    }
}

别忘了拨打setNeedsLayout或标签会被截断。