0

Blockクラス、Rowクラス、Tableクラスの3つのサブクラスがあります。すべてNSViewのサブクラスです。
プログラムで8行を表示するIBが追加されたテーブルがあり、各行には8ブロックが表示されます。BlockのmouseDown:メソッドを無効にして、背景色を赤に変更しましたが、機能しません。それでも、IBを使用してテーブルのすぐ上にブロックを追加すると、ブロックが機能するため、最初のケースでブロックが機能しない理由がわかりません。

ブロックと行の実装コードは次のとおりです(テーブルの実装は行の実装と同じように機能します)。

//block.m

- (void)drawRect:(NSRect)dirtyRect
{
    [color set];
    [NSBezierPath fillRect:dirtyRect];
}

-(void)mouseDown:(NSEvent *)theEvent
{
    color = [NSColor redColor];
    checked = YES;
    [self setNeedsDisplay:YES];
}

//row.m

- (void)drawRect:(NSRect)dirtyRect
{

    [[NSColor blueColor] set];
    [NSBezierPath fillRect:dirtyRect];
    int x;
    for(x=0; x<8; x++){
    int margin = x*2;
    NSRect rect = NSMakeRect(0, 50*x+margin, 50, 50);
    Block *block = [[Block alloc] initWithFrame:rect];
    [self addSubview:block];
    }
}
4

2 に答える 2

0

NSTableView は、描画に NSView ではなく NSCell オブジェクトを使用することをご存知ですか? そうでない場合は、NSCell を調査します。それを NSTable のカスタム描画に使用するのがよい方法です。

于 2012-10-29T04:58:14.580 に答える
0

問題を理解しました... mouseDown の実装によりブロックが再描画され、そのスーパービューでさえ、テーブルの drawRect: メソッドが呼び出され、古いブロックの上に新しいブロックが描画されるため、決してないように見えます色を変える。そのため、最初に YES に設定された isFirstAppearance というテーブルのプロパティを作成しました。YES の場合、テーブルは行を描画し、それ自体を NO に設定します。

于 2012-10-29T15:52:48.167 に答える