0

XCode 4.6.3 で iOS プログラムを実行しているときに、次のようなエラーの長いリストが表示され続けます。

Jul 20 13:24:40 ps2xipas3qfe Chess[277] <Error>: CGContextSetRGBFillColor: invalid context 0x0
Jul 20 13:24:40 ps2xipas3qfe Chess[277] <Error>: CGContextFillRects: invalid context 0x0

エラーを生成するコードは次のとおりです。

- (void)drawRect: (CGRect)rect {
    //[super drawRect:rect];
    for(int i=0; i<8; i++) {
        for(int j=0; j<8; j++) {
            CGRect TheRect = CGRectMake(i*30+30,j*30+30,30,30);
            CGContextRef context = UIGraphicsGetCurrentContext();
            if(i%2 == j%2) {
                CGContextSetRGBFillColor(context,1.0,0.0,0.0,0.0);
            }
            else {
                CGContextSetRGBFillColor(context,0.0,0.0,0.0,0.0);
            }
            CGContextFillRect(context,TheRect);
        }
    }
}

「無効なコンテキスト」エラーについて Web を検索したところ、グラフィック コンテキストは「drawRect」メンバー関数内からのみ取得できるという回答が得られましたが、これは「drawRect」関数内にあり、まだ取得中です。エラー。ここでのクラスはChessBoardから継承されUIViewます。


助けてくれてありがとう、でもプログラムを実行できず、とても混乱しています。以前は発生していたエラーは発生しなくなりましたが、空白の画面しか表示されなくなりました。試しsetNeedsDisplayてみsetNeedsDisplayInRectましたが、どちらも機能していないようです。

ここに私が持っている関数がありますChessViewController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];
    ChessBoard* TheBoard = [ChessBoard new];
    [self.view addSubview: TheBoard];
    // [TheBoard setNeedsDisplayInRect: CGRectMake(0,0,400,400)];
    [TheBoard setNeedsDisplay];
}

ここに私が持っている関数がありますChessBoard.m:

- (void)drawRect: (CGRect)rect {
    [super drawRect:rect];
    UILabel* HelloWorld = [UILabel new];
    HelloWorld.text = @"Hello, World!";
    [HelloWorld sizeToFit];
    HelloWorld.frame = CGRectMake(1,1,100,20);
    [self addSubview:HelloWorld];
    for(int i=0; i<8; i++) {
        for(int j=0; j<8; j++) {
            CGRect TheRect = CGRectMake(i*30+30,j*30+30,30,30);
            CGContextRef context = UIGraphicsGetCurrentContext();
            CGContextFillRect(context,TheRect);
            if(i%2 == j%2) {
                CGContextSetRGBFillColor(context,1.0,0.0,0.0,1.0);
            }
            else {
                CGContextSetRGBFillColor(context,0.0,0.0,0.0,1.0);
            }
        }
    }
}
4

1 に答える 1

0

あなたのコードは非常に近いです!ただし、ChessBoard インスタンスをインスタンス化するために使用しているコードは正しくありません。"new" (Objective-C では常に避けるべき) を使用する代わりに、UIView のドキュメントでは、initWithFrame: 初期化メソッドを使用する必要があると指摘されています。

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGRect boardFrame = CGRectMake(0, 0, 240, 240);
    ChessBoard *theBoard = [[ChessBoard alloc] initWithFrame:boardFrame];
    [self.view addSubview:theBoard];
}

試してみると、描画コードが機能していることがわかるはずです。

于 2013-07-21T00:26:48.850 に答える