4

我有一个NSTableView没有绑定的填充。

在 datasource 方法tableView:objectValueForTableColumn:row:中,我重新排序我的数据并告诉表视图在将编辑提交到模型后重新加载,以便在编辑后恢复正确的排序顺序。

但是,如果用户通过单击不同的行来结束编辑,并且由于刚刚结束的编辑而导致排序顺序发生了变化,则可能会发生用户打算选择的行在他单击后刚刚移动的情况。因此,不是该行,而是选择了现在位于该位置的另一行。

我尝试了这些方法的各种组合NSTableViewDelegate,但找不到调整选择的解决方案,即当编辑结束后重新排序时,刚刚移开的行被选中。我怎样才能做到这一点?

4

2 回答 2

3

我会用这个:

我建议sort您在 NSTableView 委托中使用您的数据,setObjectValue:而不是objectValueForTableColumn:

并更改 NSTableView 委托中的选择selectionIndexesForProposedSelection:

此解决方案管理单个选择,如果您希望它管理单个和多个选择,我会更改我的答案。如果用户双击,它不起作用,因为它将选择更改为第二次单击。

你需要这些变量:

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

我总是以艰难的方式做到这一点:在执行需要恢复选择的操作之前,我会记住当前的选择——不是通过行索引,而是通过我可以在数据中找到的东西。通常我有一个字典数组,所以我只记得字典指针。

在 tableview 上完成了我需要做的任何事情之后,我只是再次浏览数据,寻找我的对象以找到新的索引......

于 2012-07-07T22:33:47.070 回答