2

我使用 aNSMutableDictionary来存储一些关于某些UITableViewCells 的值,所以我使用 as 的实例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是一个NSIndexPathminHeight是一个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 保存s NSNumber

4

1 回答 1

3

我记得在 iOS6 中阅读过有关NSIndexPath方法isEqual:hash两者都发生变化的信息,或者只是在 iOS 5 中存在错误。无论如何,您似乎不能将它们用作 dict 键。

尝试使用不同的键。也许使用它的description方法或使用部分和行构建的自定义字符串。

#define idx2key(_ip) [NSString stringWithFormat:@"%d:%d", [_ip section], [_ip row]]

...
self.heights[idx2key(indexPath)] = minHeight;
...

在老NSIndexPath苹果说:

NSIndexPath 对象是唯一且共享的。如果包含指定索引的索引路径已存在,则返回该对象而不是新实例。

那段已经不存在了。我想实例的内部比较也已更改。

于 2013-01-05T16:23:53.207 回答