2011-12-22 20 views
4

私はすべての項目と列のNSTableViewをクリアするメソッドを実装しようとしています。私は次のことを実現しようとすると、しかし、私はクラッシュを取得:NSTableViewからすべてのNSTableColumnを削除するにはどうすればよいですか?

- (void)clearResultData 
{ 
    [resultArray removeAllObjects]; 
    NSArray *tableCols = [resultTableView tableColumns]; 
    if ([tableCols count] > 0) 
    { 
     id object; 
     NSEnumerator *e = [tableCols objectEnumerator]; 
     while (object = [e nextObject]) 
     { 
      NSTableColumn *col = (NSTableColumn*)object; 
      [resultTableView removeTableColumn:col]; 
     } 
    } 
    [resultTableView reloadData]; 
} 
+1

クラッシュにはコンソールにメッセージが表示されますか? –

答えて

14

まあ、それはあなたがこのようなすべての列削除することができます任意の助けだ場合:

- (void)removeAllColumns 
{ 
    while([[tableView tableColumns] count] > 0) { 
     [tableView removeTableColumn:[[tableView tableColumns] lastObject]]; 
    } 
} 
0
[[[_tableView tableColumns] copy] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    [_tableView removeTableColumn:obj]; 
}]; 
3

をNSArrayのは、tableColumnsによって返さremoveTableColumnによって変更されます。それが変わらないと仮定しないでください。

変更不可能なNSArrayとして返されますが、基本となる実装が変更されており、変更されたコレクションでNSEnumeratorを使用することは安全ではありません。 whileループでは、現在のオブジェクトが削除された列挙子にnextObjectメッセージを送信しています。悪いことが起こる可能性があります。テーブルビューには列が存在しない場合

NSTableColumn* col; 
while ((col = [[tableView tableColumns] lastObject])) { 
    [tableView removeTableColumn:col]; 
} 

:ここ

がより効率的実装のこのtableColumnsは、空の配列を返し、lastObjectは、空の配列にnilを返し、COLはゼロの値が割り当てられ、 conditionはfalseでwhileループは終了します。