1

ココアでビューベースのTableViewを扱っています。tableview データ ソース メソッドでは、関連するオブジェクトのタイプに基づいて 3 つの異なるセルを作成したいと考えています。
私のアイデアは、if ステートメントの前にセルのジェネリック id 変数を作成し、if 内の適切なセル型にキャストして、関連するオブジェクトをイントロスペクションすることでした。残念ながら、このメソッドでは、xcode は、ジェネリック セル変数に、内部に設定しようとしているプロパティがないことを訴えます。前の行で行ったキャストを認識しません。

これは非常に基本的な質問であることは承知していますが、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;
}    
4

2 に答える 2

3

idObjective-Cではすべてが定義上 の子孫であるため、代入をキャストする必要はありません。代わりに、プロパティを逆参照する場所をキャストする必要があります。したがって、コードを次のように変更します。

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
}
于 2012-07-04T05:59:23.277 に答える
-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; }
于 2012-07-04T05:53:27.363 に答える