9

をとしてNSMutableDictionary使用してに値を格納および取得しようとすると失敗する可能性がある特定の理由はありますか?NSIndexPathkey

NSMutableDictionary私は元々、のUITableViewCell高さ ( self.cellHeights)を格納するためにこれを実行しようとしましたUITableView。をタップするたびに、その特定UITableViewCellの に格納されている値に基づいて、セルが 2 つの異なる高さの間で拡大または縮小します。NSMutableDictionaryindexPath

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

私にはわからない理由で、tableView:didSelectRowAtIndexPath:ビア内のセルの高さを取得するのは[self.cellHeights objectForKey:indexPath]うまくいきます。ただし、tableView:heightForRowAtIndexPath:via内でセルの高さを取得しようとすると、常に nil が返されます。これは、高さを格納するために使用される indexPath が、セルの高さを取得するために使用される indexPathと[self.cellHeights objectForKey:indexPath]一致しないように見えるためです。このため、「同じ」インデックス パスの新しいオブジェクトが追加されます(その後増加するため明らかです)。indexPath.sectionindexPath.rowself.cellHeightsself.cellHeights.count

これは、行 ( ) をキーとしてNSMutableDictionary にセルの高さを格納する場合には発生しません[NSNumber numberWithInteger:indexPath.row]indexPath

4

3 に答える 3

5

@Jean の回答は受け入れられるようですが、この質問はこちらで詳しく回答されています。要するに、の代わりに のUITableViewインスタンスを使用する場合があり、これら 2 つのクラスのインスタンスが等しくなることはありません。回避策は、ディクショナリ キーの検索など、またはに依存するすべてのキーを常に生成することです。NSMutableIndexPathNSIndexPath[NSMutableIndexPath class] != [NSIndexPath class]NSIndexPathisEqualhash

- (NSIndexPath *)keyForIndexPath:(NSIndexPath *)indexPath
{
    if ([indexPath class] == [NSIndexPath class]) {
        return indexPath;
    }
    return [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section];
}
于 2014-02-10T19:28:17.217 に答える