NSTableView - 在点击不同的行之后结束编辑并选择已点击的行

4

我有一个NSTableView,它在没有绑定的情况下得到填充。

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

然而,如果用户通过单击不同的行来结束编辑,并且由于刚刚结束的编辑而更改了排序顺序,则可能会发生用户打算选择的行刚好在他单击它之后移动的情况。因此,选中的是该位置上现在存在的另一行,而不是那一行。

我尝试了各种组合的NSTableViewDelegate方法,但无法找到一种解决方案,可以调整选择方式,使得在编辑结束后重新排序时,刚刚移动的行会被选中。我该如何实现这个目标?

2个回答

3
我会用这个:
我建议在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
}

2

我总是以一种繁琐的方式来完成这项工作:在需要恢复选择的操作之前,我会记住当前的选择 - 不是按行索引,而是通过我的数据中可以找到的某些内容。通常情况下,我有一个字典数组,所以我只需要记住字典指针。

在对表格视图进行任何必要的操作后,我只需再次遍历数据,寻找我的对象以找到新的索引...


这正是我试图做的事情,但我没有成功。哪个数据源/代理方法是我需要知道何时恢复选择的正确方法?哪一个是正确的保存选择的方法?或者说,应该被选中的行在用户点击它以结束编辑之前还没有被选中。 - tajmahal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接