8

編集: この回答の解決策は、iOS7 が時々返されたり、返されたりすることに関連していNSIndexPathますNSMutableIndexPath。この問題は実際には とは関係ありませんでしbegin/endUpdatesたが、解決策が他の人に役立つことを願っています。


すべて - iOS 7 でアプリを実行していますが、beginUpdatesおよびのendUpdatesメソッドで問題が発生していUITableViewます。

タッチしたときにセルの高さを変更する必要があるテーブルビューがあります。以下は私のコードです:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

        // If our cell is selected, return double height
        if([self cellIsSelected:indexPath]) {
            return 117;
        }

        // Cell isn't selected so return single height
        return 58;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

        ChecklistItemCell *cell = (ChecklistItemCell *)[self.tableview cellForRowAtIndexPath:indexPath];
        [cell.decreaseButton setHidden:NO];
        [cell.increaseButton setHidden:NO];

        // Toggle 'selected' state
        BOOL isSelected = ![self cellIsSelected:indexPath];

        DLog(@"%@", selectedIndexes);

        DLog(@"is selected: %@", isSelected ? @"yes":@"no");
        // Store cell 'selected' state keyed on indexPath
        NSNumber *selectedIndex = @(isSelected);
        selectedIndexes[indexPath] = selectedIndex;

        [tableView beginUpdates];
        [tableView endUpdates];

}

beginUpdatesおよびendUpdatesメソッドはかなり一貫性のない動作をしています。メソッドはタッチごとに正しく呼び出され(didSelectRowAtIndexPath最初はUIがブロックされていると思いました)、selectedIndexes交互の値を正しく保存しています。問題は、表のセルに触れて、すべてのメソッドが適切に呼び出されることがありますが、セルの高さが変わらないことです。何が起こっているか知っている人はいますか?

4

2 に答える 2

21

iOS7 では動作が変更されており、インデックス パスが のインスタンスである場合もあれば のインスタンスである場合もありNSIndexPathますUIMutableIndexPath。問題は、isEqualこれら 2 つのクラスの間で常に が返されることNOです。したがって、インデックス パスをディクショナリ キーとして、または に依存する他のシナリオで確実に使用することはできませんisEqual

いくつかの実行可能な解決策を考えることができます。

  1. のインスタンスを常に返すメソッドを作成し、NSIndexPathそれを使用してキーを生成します。

    - (NSIndexPath *)keyForIndexPath:(NSIndexPath *)indexPath
    {
        if ([indexPath class] == [NSIndexPath class]) {
            return indexPath;
        }
        return [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section];
    }
    
  2. インデックス パスではなく、データによって行を識別します。たとえば、データ モデルが の配列であるNSString場合、その文字列をキーとしてselectedIndexesマップに使用します。データ モデルが の配列である場合は、 などNSManagedObjectsを使用します。objectID

私のコードでは、これらのソリューションの両方をうまく使用しています。

EDITNSIndexPaths修正されたソリューション (1)ではなく、@ rob の戻りの提案に基づいていNSStringsます。

于 2013-09-20T15:33:14.820 に答える