动态更改静态单元格上的节标题文本

Posted

技术标签:

【中文标题】动态更改静态单元格上的节标题文本【英文标题】:Dynamically change the section header text on a static cell 【发布时间】:2017-02-09 03:06:53 【问题描述】:

我有一个 UITableViewController,它的表格视图有静态单元格,在故事板中定义。

我的表格视图有两个部分。第一个有两个单元格,第二个部分有三个单元格。第二部分的标题中也有文本。

我想做的是,当用户点击第一部分中的第一个或第二个单元格时,更新第二部分的标题文本。动态执行此操作并使用动态内容(例如,日期和时间在他们点击单元格的那一刻显示在那里)。

我尝试了很多东西,但 viewForHeaderSection 只被调用一次。

我用

注册了标题部分单元格
tableView.registerClass(TableSectionHeader.self, forHeaderFooterViewReuseIdentifier: "secondSectionCell")

TableSectionHeader 就是:

class TableSectionHeader: UITableViewHeaderFooterView  

然后我可以动态设置节标题,如下所示:

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
    if section == 1 
        if let cell = tableView.dequeueReusableHeaderFooterViewWithIdentifier("secondSectionCell") 
            cell.textLabel?.text = "hello world"
            return cell
        

    

    return nil

我也实现了如下覆盖,因为有人建议在实现viewForHeaderInSection的时候,也是必须的:

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 
    return 40.0

即使如此。 viewForHeaderInSection 只被调用一次。

我是否能够以某种方式如上所述动态刷新节标题文本?

【问题讨论】:

你做不到。对此没有官方文档。您需要执行自定义方法,例如:***.com/questions/23501952/…,但是,我强烈建议您不理会节标题,而是使用单元格代替它们作为每个节中的第一个单元格。除非你想做一些粘性标题或其他你真正需要的东西。 @Sneak 我喜欢你的建议。可能是最简单的方法。唯一要做的就是摆弄表格视图来处理分隔单元格的线条,以及它们是如何从表格视图的左边缘插入的。 tableView.reloadSections 将重新加载页眉(和页脚)以及该部分的内容 @dbarros 这真的不是那么麻烦,实际上更容易和可定制。只需添加注册 XIB ,子类化 Cell 并使用 Autolayout,您可以自定义所有内容 100% 。如果你想要间距,你可以简单地在 XIB 中使用 Autolayout 等添加边框。自定义边框颜色,你需要的一切。 :) @Dale 好吧,这不正确,如果您重新加载单元格,您的 cellForRow 将与您的其余数据源和委托一起被调用。例如,如果您在单元格中有一个 UITextField,并且用户有一个当前输入,则该输入将被取消。如果您正在播放电影/视频,它将重新加载。如果您从 NSURL 设置了图像,它将重新加载......等等等等。:) 这一切都是从案例到案例的,如果它适用于您的案例,那么您的答案是 100% 有效的,但是,我认为OP 有一些他不想重新加载的内容。因此他只想重新加载特定部分。 【参考方案1】:

您实际上可以使用传统的表格视图方式轻松实现这一点。

即使它是静态 UITableView,在你的 dataSource 视图控制器中,你仍然可以实现- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

那么您如何即时更新标题?为这个视图控制器创建一个属性,比如NSString *titleForSecondSection。每当用户点击第一部分中的单元格时,您只需在回调- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 中更新此属性

最后一步是在修改titleForSecondSection 属性后调用[self.tableView reload]。或者如果你不想重新加载整个表格视图,只需调用- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation

需要明确的是,在您的- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 中,对于不需要更改标题的部分,只需返回一个静态字符串。对于需要更改标题的部分,返回您创建的动态属性。

【讨论】:

对不起,我刚刚注意到您使用的是 Swift。应该在 Swift 中发布。但这是相同的想法。希望能帮助到你。 :)【参考方案2】:

viewForHeaderInSection 只会在重新加载 tableview 时调用。所以假设你不想重新加载整个 tableview,你可能需要直接更改 label 的内容。 伪代码如:

var label_first_section_header //as global variable

然后在 viewForHeaderInSection 中将其指向标签

if section == 1 
    if let cell = tableView.dequeueReusableHeaderFooterViewWithIdentifier("secondSectionCell") 
        cell.textLabel?.text = "hello world"
        label_first_section_header = cell.textLabel
        return cell
    

然后您可以随时动态更改文本,例如在 didSelectRowAtIndexPath 中

【讨论】:

以上是关于动态更改静态单元格上的节标题文本的主要内容,如果未能解决你的问题,请参考以下文章

将占位符添加到表格视图单元格上的文本字段

我想在 tableview 单元格中显示文本字段数据,以替换 iphone 中单元格上的现有数据?

如何在ios中的tableview单元格上的文本字段上返回文本字段上的键盘

UICollectionView 更改布局 - 更改单元格

将组合框单元格上的双击激活更改为单击?

iOS - 表格视图 - 静态单元格(分组) - 更改部分标题文本颜色