4

NSTableViewバインディングなしで入力されるがあります。

datasourceメソッドtableView:objectValueForTableColumn:row:では、データを再並べ替え、モデルの編集をコミットした後にテーブルビューに再読み込みするように指示します。これにより、編集後に正しい並べ替え順序が復元されます。

ただし、ユーザーが別の行をクリックして編集を終了し、編集が終了したために並べ替え順序が変更された場合、ユーザーが選択しようとした行をクリックした直後に移動した可能性があります。そのため、その行の代わりに、現在その場所にある別の行が選択されます。

さまざまな方法の組み合わせを試しNSTableViewDelegateましたが、編集終了後の並べ替えが発生したときに、移動したばかりの行が選択されるように選択を調整する解決策が見つかりませんでした。どうすればこれを達成できますか?

4

2 に答える 2

3

私はこれを使用します:

代わりにsortNSTableViewデリゲートのデータをお勧めしますsetObjectValue:objectValueForTableColumn:

NSTableViewデリゲートの選択を変更しますselectionIndexesForProposedSelection:

このソリューションは単一の選択を管理します。単一および複数の選択を管理する場合は、答えを変更します。ユーザーがダブルクリックすると、選択が 2 回目のクリックに変更されるため、機能しません。

これらの変数が必要です:

int originalRowIndex;
NSUInteger newRowIndex;

この変数を初期化します。originalRowIndex = -1;

- (void)tableView:(NSTableView *)aTable setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aColumn row:(int)rowIndex {
    id objectAtRow = [myMutableArray objectAtIndex:rowIndex];
    NSString *columnKey = [aColumn identifier];
    [objectAtRow setValue:anObject forKey:columnKey];


    originalRowIndex = rowIndex; // get the original index
    [myMutableArray sortUsingDescriptors:[aTable sortDescriptors]]; // re-sort the mutable array
    newRowIndex = [myMutableArray indexOfObjectIdenticalTo:objectAtRow]; // get the new index
    if (newRowIndex == originalRowIndex) originalRowIndex = -1; // same position
}
// not called on empty selection
- (NSIndexSet *)tableView:(NSTableView *)tableView selectionIndexesForProposedSelection:(NSIndexSet *)proposedSelectionIndexes {
    int oIndex = originalRowIndex;
    originalRowIndex = -1;
    if (oIndex > -1 && [proposedSelectionIndexes count] > 1) { // if oIndex = -1 or multi selection , do nothing
        int i = [proposedSelectionIndexes firstIndex]; 
        if (oIndex < newRowIndex) { 
            if (i > oIndex && i <= newRowIndex) return [NSIndexSet indexSetWithIndex:(i - 1)];//shift the row index
        } else {
            if (i < oIndex && i >= newRowIndex) return [NSIndexSet indexSetWithIndex:(i + 1)];//shift the row index
        } //else doesn't change the selection, this index is out of range (originalIndex...newIndex)
    }
    return proposedSelectionIndexes;// doesn't change the selection
}
于 2012-07-09T21:14:47.900 に答える
2

私はいつもこれを困難な方法で行ってきました.選択を復元する必要がある何かを行う前に、現在の選択を覚えています-行インデックスではなく、データで見つけることができるものによって。多くの場合、辞書の配列を持っているので、辞書ポインターだけを覚えています。

テーブルビューで必要なことをすべて行った後、データをもう一度調べて、オブジェクトを探して新しいインデックスを見つけます...

于 2012-07-07T22:33:47.070 に答える