在NSTableView中反转当前选定的项目

时间:2014-01-17 00:50:11

标签: macos cocoa

目前,我可以使用以下内容反转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];
}

这是正确的,还是有更优雅的方式?

2 个答案:

答案 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)