2012-02-25 39 views
3

我有一個NSTableView,其內容綁定到一個arrayController使用filterPredicate。 tableView是基於視圖的,因此其代表被設置爲具有基於視圖的NSTableView產生與綁定和委託的奇怪結果

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

方法的對象。我遇到了奇怪的行爲,這可能與我觀察到的有關,即使控制器的sortedObjects數爲0,也會調用此方法。此外,每次調用方法時,它要求的行數都是總數數組控制器內容中的對象(與佈置對象相對)。它認爲這可能是因爲當我設置cellView的objectValue使用

cellView.objectValue = [arrayController arrangedObjects] objectAtIndex:row]; 

它通常是錯誤的。有任何想法嗎?

回答

0

好了,我仍然無法解釋爲什麼有人行爲,因爲它是,但我還是設法把事情以正確的行爲,執行以下操作:

  • 結合的tableView內容arrayController的arrangedObjects
  • :在的tableView用於將tableCellView的objectValue
  • 提供每個tableCellView如下(其中BILSelectableRoundedTableCellView恰好是NSTableCellView的子類)的合適的keyPath的tableCellview的

  • 結合各種元件
    (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 
    
    NSInteger numberOfObjects = [self.arrayController.arrangedObjects count]; 
    
    if (numberOfObjects == 0) 
        return nil; 
    
    if (row >= numberOfObjects) 
        return nil; 
    
    BILSelectableRoundedTableCellView *viewForTableColumnRow = [self.myTableView makeViewWithIdentifier:@"DataCell" owner:self]; 
    
    return viewForTableColumnRow; } 
    

最後,使用實現以下數據源:

(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 

NSInteger numberOfObjects = [self.arrayController.arrangedObjects count]; 

if (numberOfObjects == 0) 
    return nil; 

if (row >= numberOfObjects) 
    return nil; 

return [self.arrayController.arrangedObjects objectAtIndex:row]; } 

使用後似乎違背了文檔在那裏,但要得到的東西才能正常工作。有趣的是,當使用綁定時,其他數據源方法(numberOfRowsInTableView)不會被調用,儘管當我不使用綁定時會調用它。

1

對於綁定的情況,objectValueForTableColumn不是必需的。剛剛撞我的頭靠在牆上幾分鐘和阻力最小的這條路回來:綁定你NSOutlineView內容到NSTreeController(arrangedObjects控制鍵結合各自的子視圖

1))

2) NSTableCellView到封閉的NSTableCellView(objectValue.foo其中foo是目標字段的關鍵路徑)

3)在大綱視圖中爲每列設置標識符(我這樣做是爲了跟蹤啓動之間表列的重新排序)

4)確保每個NSTableCellView都有標識設置爲自動(或相同表列)**這是重要的,我搞砸**

5)當你調用makeViewWithIdentifier:確保你通過tableColumn.identifier

這是假設每個表格列只有一個單元格視圖類型。否則,您需要在makeViewWithIdentifier:中傳入您想要的單元格視圖的正確標識符。

相關問題