2014-01-17 42 views
0

目前入圍項目目前我能反轉在一個NSTableView當前選擇的項目:反相在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

您可以做的最重要的改進是採用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]; 
} 
+0

完美答案,謝謝。我對可可的發展頗爲陌生,並且仍然拿起這樣的知識。我現在也明白了ARC在做什麼,解鎖了另一個謎團! – TheSavage