3

NSTableCellViewカスタム描画を行うためのサブクラスを作成しました。テーブルのコンテンツはNSArrayControllerへのバインドを通じて取得されるため、新しいデータがNSArrayControllerに追加されると、NSTableCellViewサブクラスの新しいインスタンスが「自動的に」作成されます。新しいインスタンスが作成されたときに一度実行するコードが必要なので、それを入れる必要があると思いましたinit。initとinitWithFrameの両方を実装しましたが(以下を参照)、サブクラスの新しいインスタンスが作成されたときにどちらも呼び出されないようです(つまり、コンソールにNSLogメッセージが表示されません)。使用する必要のある別のinitメソッドはありますか?

- (id)init {
    self = [super init];
    if (self) {
        // Initialization code here.
        NSLog(@"init");
    }
    return self;
}

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
        NSLog(@"init with frame");
    }
    return self;
}
4

1 に答える 1

9

あなたの質問に答えるために、指定された初期化子はinitWithFrame:です。ただし、ビューがNIBでエンコードされている場合(この場合のように)、initWithCoder:が呼び出されます。そのメソッドをオーバーライドする必要があります。

awakeFromNibを使用しないでください。一般的に、予想以上に頻繁に呼び出される可能性があり、人々に迷惑をかけるのを見てきました。

ただし、セルの初期化を行うのに適した場所は、テーブルビューデリゲートメソッドviewForTableColumn:rowです。-引き続​​きセルを使用してバインディングを使用できます。

コービン(私は問題のクラスを書きました)。

于 2013-01-24T17:56:28.597 に答える