2013-03-25 25 views
0

如何從我的NSTableView中刪除NSTableCellView(或其子類)?刪除NSTableCellView

當我清空我的數組信息,爲新信息排隊DB,然後重新加載表數據時,它只更新索引值與新數組列表中找到的索引值類似的單元格。

ex。

我首先在我的數組中有8個對象,它們顯示正常。當我更新我的陣列,現在只有3,表中前三個單元格得到更新,而最後5個仍然是舊的。舊的不可選擇,但只能看到。我懷疑我錯過了一些重繪/ dealloc ..

我試過setNeedsDisplay在TableView上,但沒有運氣呢。

進出口使用ARC時,Xcode 4.6.1和OS X 10.8.3

示例代碼

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { 

    return [_array count]; 
} 

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 

    [_tableView setNeedsDisplay]; 

    NSDictionary *d = [_array objectAtIndex:row]; 
    NSString *identifier = [tableColumn identifier]; 

    if ([identifier isEqualToString:@"MainCell"]) { 

     CustomCellView *cellView = [tableView makeViewWithIdentifier:@"MainCell" owner:self]; 
     [cellView.textField setStringValue:d[@"from"]]; 
     [cellView.subject setStringValue:d[@"subject"]]; 
     [cellView.text setStringValue:d[@"text"]]; 
     [cellView.date setStringValue:d[@"date"]]; 

     return cellView; 
    } 

    return nil; 
} 
+0

同意@馬特 - 您可以張貼numberOfRowsInSection:和的cellForRowAtIndexPath:數據源的方法呢? – danh 2013-03-25 22:40:21

+0

基本的配方是這樣的:你有一個支持表格的數組。 numberOfRows將回答該數組的長度,任何在其簽名中具有indexPath的內容都將引用indexPath.row中的數組。改變數組和(在最簡單的情況下)調用[tableView reloadData]; – danh 2013-03-25 22:42:17

+1

我最後發現了這個問題(幾乎所有的事情都是一點一點的發表評論之後)。我在我的cellView類中有一個空的drawRect,它將重新繪製出來。 – d00dle 2013-03-27 16:26:22

回答

1

你必須告訴NSTableView的,以reloadData(這聽起來像你正在做的)。當你這樣做時,數據源的工作是知道現在只有3行,並在numberOfRowsInTableView:中給出了答案(這聽起來像你沒有這樣做)。你不會顯示任何代碼(爲什麼不?),當然所有這些都是猜測。

+0

我這樣做,它返回適量的行,然後繪製它們。問題是基於不存在的信息的觀點仍然在屏幕上。我現在不在家,但我可以在今天晚些時候發表一些例子。 – d00dle 2013-03-26 09:00:37

0

使用

[tableView removeRowsAtIndexSet:indexSet withAnimation:YES]; 
+0

不會這只是刪除行?因爲我有一個委託方法告訴我rowview已被刪除。 (的tableView:didRemoveRowView:forRow :) – d00dle 2013-03-26 13:44:02

0

可以(清/更新/重繪),你cellView這個例子:

  1. 創建具有相同的幀作爲原新電池。
  2. 重新繪製它與原始幀相同。
  3. 將原始對象放入其中。

在這個例子中,「mainTable」是你表的NSTableView *。

- (NSView *)tableView:(NSTableView *)aTableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 

    NSString* identifier = [tableColumn identifier]; 
    NSTableCellView* cellView = [[NSTableCellView new] initWithFrame:[[mainTable makeViewWithIdentifier:identifier owner:self] frame]]; 

    [cellView drawRect:[[mainTable makeViewWithIdentifier:identifier owner:self] frame]]; 
    cellView = [mainTable makeViewWithIdentifier:identifier owner:self]; 

    // do something with your cellView here ... 

    return cellView; 
}