2

NSMutableDictionaryいくつかの sに関するいくつかの値を格納するために a を使用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ですminHeightNSNumber)

デリゲートが要求したときに、これらの値を動的に設定します。

- (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;
}

は、テーブル ビュー内のすべての indexPathのminimumHeights NSDictionaryも保持します。NSNumber

4

1 に答える 1

3

NSIndexPathiOS6 でメソッドisEqual:またはその両方が変更されたこと、または iOS 5 にバグがあったことについて読んだことを覚えていhashます。いずれにせよ、それらを dict キーとして使用することはできないようです。

別のキーを使用してみてください。おそらく、そのdescriptionメソッドまたはセクションと行で構築されたカスタム文字列を使用します。

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

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

古いNSIndexPathAppleは言った:

NSIndexPath オブジェクトは一意で共有されます。指定されたインデックスを含むインデックス パスが既に存在する場合、新しいインスタンスの代わりにそのオブジェクトが返されます。

その段落はもうありません。インスタンスの内部比較も変更されていると思います。

于 2013-01-05T16:23:53.207 に答える