gpt4 book ai didi

macos - NSTableView – 在编辑结束后通过单击不同的行来选择单击的行

转载 作者:行者123 更新时间:2023-12-03 16:13:47 26 4
gpt4 key购买 nike

我有一个 NSTableView,它无需绑定(bind)即可填充。

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

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

我尝试了 NSTableViewDelegate 方法的各种组合,但找不到一种解决方案来调整选择,以便在编辑结束后重新排序时,刚刚排序的行搬走被选中。我怎样才能实现这个目标?

最佳答案

我会用这个:

我建议在 NSTableView 委托(delegate) setObjectValue: 中对数据进行排序,而不是 objectValueForTableColumn:

并更改 NSTableView 委托(delegate)中的选择 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
}

关于macos - NSTableView – 在编辑结束后通过单击不同的行来选择单击的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11379106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com