如果用户一次又一次地推送相同的表格,我试图改变价值。
在我的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;
答案 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];
}
在比较实际指针时:
if (indexPath == self.index) { ... }
您需要知道NSIndexSet
的相同实例可以保留不同的row
和section
值(根据我的评论),因为它们可以重复使用( !)UITableView
,所以你可能想要比较实际的指数而不是指针。
,同时保留索引路径的指针,如:
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
是来自当前section
(AAA
)和当前row
(BBB
)的键 ,值是水龙头的数量。
所以,您可以将该集合视为
5
次; 1
次; 0
次; (此行没有关于任何点击的记录!) 2
次; 6
次; 3
次; 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) ...