【发布时间】:2013-11-05 23:50:36
【问题描述】:
尝试使用NSIndexPath 作为key 在NSMutableDictionary 中存储和检索值可能会失败,有什么特别的原因吗?
我最初尝试这样做是为了将NSMutableDictionary 的UITableViewCell 高度(self.cellHeights)存储为UITableView。每次您点击UITableViewCell 时,该单元格将根据NSMutableDictionary 中存储的特定indexPath 的值在两个不同的高度之间扩展或收缩:
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSNumber *heightNSNumber = [self.cellHeights objectForKey:indexPath];
if (!heightNSNumber)
{
heightNSNumber = [NSNumber numberWithFloat:100.0];
[self.cellHeights setObject:heightNSNumber forKey:indexPath];
}
return [heightNSNumber floatValue];
}
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
NSNumber *heightNSNumber = [self.cellHeights objectForKey:indexPath];
if (!heightNSNumber)
{
heightNSNumber = [NSNumber numberWithFloat:100.0];
[self.cellHeights setObject:heightNSNumber forKey:indexPath];
}
if ([heightNSNumber floatValue] == 100.0)
{
[self.cellHeights setObject:[NSNumber numberWithFloat:50.0]
forKey:indexPath];
} else {
[self.cellHeights setObject:[NSNumber numberWithFloat:100.0]
forKey:indexPath];
}
[tableView beginUpdates];
[tableView endUpdates];
}
由于我不知道的原因,通过[self.cellHeights objectForKey:indexPath] 获取tableView:didSelectRowAtIndexPath: 内的单元格高度可以正常工作。但是,尝试通过[self.cellHeights objectForKey:indexPath] 获取tableView:heightForRowAtIndexPath: 中的单元格高度总是返回 nil,因为用于存储高度的 indexPath 似乎与用于获取单元格高度的 indexPath 不匹配,即使它们具有相同的indexPath.section 和 indexPath.row 的值。因此,“相同”索引路径的新对象被添加到self.cellHeights(因为self.cellHeights.count 此后增加)。
当您使用行 ([NSNumber numberWithInteger:indexPath.row]) 作为键将单元格高度存储在 NSMutableDictionary 中时,不会发生这种情况......所以这就是我现在正在做的事情,但我想了解为什么indexPath 不能作为关键。
【问题讨论】:
标签: objective-c cocoa-touch uitableview nsmutabledictionary nsindexpath