我正在使用NSMutableDictionary
来存储某些UITableViewCell
的值,因此我使用NSIndexPath
的实例作为键。一切都在iOS 6上按预期工作,但是当我在iOS 5模拟器中运行完全相同的代码时,会发生奇怪的事情。所以我将字典的内容打印到控制台:
Printing description of heights:
{
"<UIMutableIndexPath 0x6a8a3d0> 2 indexes [1, 3]" = 100;
"<UIMutableIndexPath 0x6a8a3d0> 2 indexes [1, 3]" = 100;
"<UIMutableIndexPath 0x6a8a3d0> 2 indexes [1, 3]" = 100;
}
在iOS 6上,它看起来像这样:
Printing description of heights:
{
"<UIMutableIndexPath 0x75ca8c0> 2 indexes [0, 1]" = 44;
"<UIMutableIndexPath 0x75caa70> 2 indexes [0, 0]" = 10;
"<UIMutableIndexPath 0x75ca500> 2 indexes [1, 0]" = 100;
"<UIMutableIndexPath 0x717df70> 2 indexes [1, 1]" = 67;
"<UIMutableIndexPath 0x715a3e0> 2 indexes [1, 2]" = 67;
"<UIMutableIndexPath 0x717def0> 2 indexes [1, 3]" = 67;
}
显然应该是这样的!为什么iOS 5上的字典会为完全相同的密钥存储不同的值?
修改:部分代码......
字典创建只是
self.heights = [[NSMutableDictionary alloc] init];
我使用新的下标语法设置值,例如:
self.heights[indexPath] = minHeight;
(indexPath
是NSIndexPath
,minHeight
是NSNumber
。)
我在委托请求时动态设置这些值:
- (NSNumber *)heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (![indexPath isInTableView:self.tableView])
{
@throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"indexPath not in tableView" userInfo:nil];
}
NSNumber *storedHeight = self.heights[indexPath];
if (storedHeight != nil)
{
return storedHeight;
}
NSNumber *minHeight = self.minimumHeights[indexPath];
self.heights[indexPath] = minHeight;
return minHeight;
}
minimumHeights
NSDictionary
也为表格视图中的每个indexPath保留NSNumber
。
答案 0 :(得分:3)
我记得在iOS6中阅读NSIndexPath
方法isEqual:
或hash
或两者都有变化,或者只是iOS 5中存在错误。无论如何,似乎你不能将它们用作字典键。
尝试使用不同的键。也许使用其description
方法或使用section和row构建的自定义字符串。
#define idx2key(_ip) [NSString stringWithFormat:@"%d:%d", [_ip section], [_ip row]]
...
self.heights[idx2key(indexPath)] = minHeight;
...
在旧NSIndexPath
Apple说:
NSIndexPath对象是唯一且共享的。如果是索引路径 包含指定的索引或索引已存在,该对象 返回而不是新实例。
该段落不再存在。我想实例的内部比较也已经改变了。