目前,我可以使用以下内容反转NSTableView中当前选定的项目:
- (IBAction) doSelectInvert:(id) sender
{
NSIndexSet *set1=[myTable selectedRowIndexes];
NSMutableIndexSet *set2=[[NSMutableIndexSet alloc] init];
NSUInteger nCount=[myTable numberOfRows];
for(NSUInteger n=0;n<nCount;n++)
if(![set1 containsIndex:n]) [set2 addIndex:n];
[myTable selectRowIndexes:set2 byExtendingSelection:NO];
[set2 release];
}
这是正确的,还是有更优雅的方式?
答案 0 :(得分:3)
您可以采取的最重要的改进是采用ARC。通过删除额外的retain
/ release
调用,这可以使您的代码更加优雅,并防止出现大量简单错误。追踪只有有时具有可检测症状的额外release
来电并不好玩。
查看所有NSMutableIndexSet
方法,有一些更强大的运算符,如-removeIndexes:
,与一次构建一个集合相比,可以为您节省一些工作量。找到一种使用它们的方法有时意味着“颠倒”你的想法 - 例如,从所有东西中删除项目,而不是将项目添加到空集。
- (IBAction) doSelectInvert:(id) sender
{
// start with all rows
NSRange allRows = NSMakeRange(0, [myTable numberOfRows]);
NSMutableIndexSet *invertedSelection = [NSMutableIndexSet indexSetWithIndexesInRange:allRows];
//then remove the currently selected rows
[invertedSelection removeIndexes:[myTable selectedRowIndexes]];
//set the new selection
[myTable selectRowIndexes:invertedSelection byExtendingSelection:NO];
}
答案 1 :(得分:0)
Swift 5变体,基于Vincent的答案并来自@vadian:
var selection = IndexSet(integersIn: 0...tableView.numberOfRows)
selection.subtract(tableView.selectedRowIndexes)
tableView.selectRowIndexes(selection, byExtendingSelection: false)
或者,如果您不想阅读一本班轮的话:
tableView.selectRowIndexes(IndexSet(integersIn: 0...tableView.numberOfRows).subtracting(tableView.selectedRowIndexes), byExtendingSelection: false)