didSelectRowAtIndexPath每次按同一行时都会更改indexPath值?

时间:2014-08-20 16:49:35

标签: ios uitableview didselectrowatindexpath nsindexpath

如果用户一次又一次地推送相同的表格,我试图改变价值。

在我的didSelectRowAtIndexPath方法中,我使用didSelectRowAtIndexPath:indexPath方法的值创建indexPath,但每次按下相同的表格单元格时,此值都会更改。

这是正常的吗?

我的目标是当用户推送一些表格单元格时创建具有两个属性(nameOfItem,numberOfItem)的NSObject。 numberOfItem默认设置为1.我想在每次推送同一个表格单元格时更改此数字+1。

这是我的代码:

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

    NSString*nameForItem = [NSString stringWithFormat:@"%@", [self.ivc.objects objectAtIndex:indexPath.row]];
    Items *item = [Items new];
    [item setNameOfItem:nameForItem];
    [item setNumberOfItem:[NSNumber numberWithInt:1]];

    if (indexPath == self.index) {
        [item setNumberOfItem:[NSNumber numberWithInt:[item.numberOfItem integerValue]+1]]; 
    }

    self.index = indexPath;

2 个答案:

答案 0 :(得分:2)

我不确定您的真正问题,以及您希望在此实现的目标......但我会像这样改进您的代码段:

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

    NSString*nameForItem = [NSString stringWithFormat:@"%@", [self.ivc.objects objectAtIndex:indexPath.row]];
    Items *item = [Items new];
    [item setNameOfItem:nameForItem];
    [item setNumberOfItem:[NSNumber numberWithInt:1]];

    // improving comparison
    if (indexPath.row == self.index.row && indexPath.section == self.index.section) {
        [item setNumberOfItem:[NSNumber numberWithInt:[item.numberOfItem integerValue]+1]]; 
    }

    // removing unnecessary instantiate and deep-copying the current index path
    self.index = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section];
}

问题#1

在比较实际指针时:

if (indexPath == self.index) { ... }

您需要知道NSIndexSet相同实例可以保留不同的rowsection值(根据我的评论),因为它们可以重复使用( !)UITableView,所以你可能想要比较实际的指数而不是指针。


问题#2

,同时保留索引路径的指针,如:

self.index = indexPath;

你需要注意我上面提到的一个段落的完全相同的事情,关于同一个NSIndexPath的实例可以和重用来呈现新的索引


更新

如果您希望处理每个索引路径的计数器(= UITableView的当前实例中的行),则需要将这些数字永久存储在某个集合中。

我不确定当前的环境,所以我试图为这个问题提供一个通用的解决方案。

在你班上你需要这个(私人)收藏:

NSMutableDictionary *_counters;

我会像这样改变你的方法,因为我不知道Items是什么,我完全放弃了所有东西,这就是我现在所拥有的:

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

    if (_counters == nil) _counters = [NSMutableDictionary dictionary];
    NSString *_key = [NSString stringWithFormat:@"%03ld:%03ld", (long)indexPath.section, (long)indexPath.row];
    NSInteger _currentCounterForIndexPath = [[_counters objectForKey:_key] integerValue];
    [_counters setObject:@(++_currentCounterForIndexPath) forKey:_key];
}

这将为您计算每行的点击数,并为每一行增加每次点击的次数。

_counter字典将包含这样的详细信息(在我的测试应用程序的随机阶段记录):

_counter : {
    "000:000" = 5;
    "000:001" = 1;
    "000:003" = 2;
    "000:004" = 6;
    "000:005" = 3;
    "000:006" = 1;
}

其中AAA:BBB是来自当前sectionAAA)和当前rowBBB)的是水龙头的数量。

所以,您可以将该集合视为

  • 在第0部分中,第0行被点击5次;
  • 在第0部分中,第1行被点击了1次;
  • 在第0部分中,第2行被点击0次; (此行没有关于任何点击的记录!)
  • 在第0部分中,第3行被点击了2次;
  • 在第0部分中,第4行被点击了6次;
  • 在第0部分中,第5行被点击3次;
  • 在第0部分中,第6行被点击了1次;

以后如果您想要获得特定row中特定section的点击次数,您可以重复使用我更新过的方法中的代码,例如对于第0部分,第5行:

NSString *_key = [NSString stringWithFormat:@"%03ld:%03ld", 0, 5];
NSInteger _currentCounterForIndexPath = [[_counters objectForKey:_key] integerValue];

_currentCounterForIndexPath将具有点按数,目前为3

我想这很简单。

答案 1 :(得分:1)

您在这里比较对象:

if (indexPath == self.index) 

你想要做的是比较两个indexPaths的内容(在你的情况下应该是相同的):

if ([indexPath isEqual:self.index]) ...

if ([indexPath compare:self.index] == NSOrderedSame) ...