如何获得 UITableViewCell 字幕显示特定单元格被点击了多少次?

Posted

技术标签:

【中文标题】如何获得 UITableViewCell 字幕显示特定单元格被点击了多少次?【英文标题】:How to get a UITableViewCell's subtitle show how many times that specific cell was tapped? 【发布时间】:2012-09-04 14:51:40 【问题描述】:

我有一个显示数组值的 uitableview。我想知道是否有办法根据每个单元格被点击的次数来更新其表格单元格的字幕。

谢谢!

【问题讨论】:

我已经成功地在点击单元格时更新了所有字幕,使用 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath,但是我有点困惑到许多不同的值。我正在尝试使用字典来解决此问题,将数组的值存储为键,并且可能将每个键的抽头计数存储为相应的值,但到目前为止还没有运气。我还需要指出,我是 Objective-c 和 ios 开发的新手。 【参考方案1】:

首先,您需要使用NSMutableArray,以便在实例化后更改其内容。这是我刚刚尝试实现您的预​​期结果的基本概述:

在您的界面中

@property (strong, nonatomic) NSMutableArray *tapCountArray;

在你的实现中

- (void)viewDidLoad

    [super viewDidLoad];

    self.tapCountArray = [NSMutableArray new];
    int numberOfRows = 20;

    for (int i = 0; i < numberOfRows; i ++) 
        [self.tapCountArray addObject:@(0)];
    

那么重要的部分!

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return self.tapCountArray.count;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    NSString *text = [self.tapCountArray[indexPath.row] stringValue];
    [cell.textLabel setText:text];
    return cell;


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    [self.tapCountArray replaceObjectAtIndex:indexPath.row withObject:@([self.tapCountArray[indexPath.row] intValue] + 1)];
    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

当每个单元格被点击时,其detailTextLabel 中的数字将加一。

【讨论】:

像魅力一样工作!然而,有些事情我没想到会发生。现在,当我的单元格被点击时,它们会失去动画效果(蓝色选择淡化为白色)。这可能是由调用 reloadData 引起的吗?非常感谢! @user1644365 很抱歉,我对我的帖子进行了编辑,应该可以解决这个问题。【参考方案2】:

您不应该创建新的数组或集合,如果两个数组彼此不同步,这可能会导致问题。正如您在评论中建议的那样,这样做的方法是使用字典。但是,您所说的方式可能不是这样。您需要一个字典数组,其中一个键的值将是您的主要数据,而另一个键的值将是点击次数。例如,让我们调用两个键 main 和 sub,您的主要数据是一组名称。字典数组如下所示: (main:@"Tom",sub:1, main:@"Dick", sub:0, main:@"Harry",sub:2, . ....)。在 tableView:cellForRowAtIndexPath:indexPath 方法中,您可以像这样向单元格提供数据:

cell.textLabel.text = [[array objectAtIndex:indexPath.row] valueForKey:@"main"];
cell.detailTextLabel.text = [[array objectAtIndex:indexPath.row] valueForKey:@"sub"];

【讨论】:

【参考方案3】:

我认为您可以设置另一个与您现在拥有的长度相同的数组。然后当您的didSelectRowAtIndexPath 被触发时,增加新数组的indexPath.row 条目并刷新该单元格。如果您不希望打乱表格,则不需要字典。

【讨论】:

太棒了!我会试一试,让你知道。谢谢:-)【参考方案4】:

您可以将对象插入到 NSCountedSet 中,在您的 cellForRowAtIndexPath 方法中,您将获取单元格的模型对象并验证它被插入到 NSCountedSet 实例中的次数。

查看 NSCountedSet 文档:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSCountedSet_Class/Reference/Reference.html

【讨论】:

谢谢,我也一直在寻找。我试试看!

以上是关于如何获得 UITableViewCell 字幕显示特定单元格被点击了多少次?的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift - 带有左侧细节和右侧细节和字幕的 UITableViewCell?

表格单元格字幕不显示

UITableViewCell 中的字幕对齐

UITableViewCell 的字幕不会更新

UITableViewCell 样式字幕多行不起作用

如何在 UITableViewCell 中添加多行