2012-07-04 72 views
1

我正在處理基於視圖的可可中的TableView。在tableview數據源方法中,我想根據它們相關的對象的類型創建三個不同的單元格。
我的想法是在if語句之前爲單元格創建一個通用的id變量,然後將它轉換爲正確的單元格類型,如果我對它們所關聯的對象進行內省的話。 不幸的是,這個方法xcode抱怨通用單元格變量沒有我嘗試在裏面設置的屬性。它無法識別我在前一行中執行的投射。ID變量和鑄造可可

我知道這是一個非常基本的問題,但在objective-c/cocoa中解決這個問題的通常模式是什麼。

這裏是數據源的方法的代碼:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    GeneralVector *vector = [self.vectors objectAtIndex:row]; 
    id cellView; 
    if ([[self.vectors objectAtIndex:row] isKindOfClass:[Vector class]]) { 
     cellView = (VectorTableCellView *)[tableView makeViewWithIdentifier:@"vectorCell" owner:self]; 
     cellView.nameTextField.stringValue = vector.name; 
    } else if ([[self.vectors objectAtIndex:row] isKindOfClass:[NoiseVector class]]) { 
     cellView = (NoiseVectorTableCellView *)[tableView makeViewWithIdentifier:@"noiseVectorCell" owner:self]; 
    } else { 
     cellView = (ComputedVectorTableCellView *)[tableView makeViewWithIdentifier:@"computedVectorCell" owner:self]; 
    } 

    return cellView; 
}  

回答

3

你不必投射任務,因爲在Objective-C中,所有東西都被定義爲id的後代。相反,您需要在您解除引用屬性的位置投射。因此,將代碼更改爲如下所示:

if(/* some check */) { 
    // No need to cast here, we are all descended from 'id' 
    cellView = [tableView makeViewWithIdentifier:@"vectorCell" owner:self]; 
    // Here, we need to cast because we need to tell the compiler how to format 
    // the method call for the 'nameTextField' property, so it needs to know 
    // some information about the class 
    ((VectorTableCellView*)cellView).nameTextField.stringValue = vector.name; 
} else if(/* some other check... */ { 
    // and so on 
} 
-1

如果VectorTableCellView,NoiseVectorTableCellView從繼承的NSView然後,代替 「ID cellView」 的 使用 「的NSView * cellView」。

如下

  • (的NSView *)的tableView:(NSTableView的*)的tableView viewForTableColumn:(NSTableColumn *)TableColumn的行:(NSInteger的)行

{

GeneralVector *vector = [self.vectors objectAtIndex:row]; 
    NSView *cellView; 
    if ([[self.vectors objectAtIndex:row] isKindOfClass:[Vector class]]) 
    { 

     cellView = (VectorTableCellView *)[tableView makeViewWithIdentifier:@"vectorCell" owner:self]; 

     cellView.nameTextField.stringValue = vector.name; 

    } 

    else if ([[self.vectors objectAtIndex:row] isKindOfClass:[NoiseVector class]]) 
    { 

     cellView = (NoiseVectorTableCellView *)[tableView 
     makeViewWithIdentifier:@"noiseVectorCell" owner:self]; 

    } 
    else 
    { 

     cellView = (ComputedVectorTableCellView *)[tableView 
     makeViewWithIdentifier:@"computedVectorCell" owner:self]; 

    } 

    return cellView; } 
+0

'NSView'也沒有名爲'nameTextField'的屬性,這意味着您的代碼將產生OP詢問的相同錯誤。 –