Ошибка недопустимого контекста внутри функции-члена drawRect

При запуске программы iOS в XCode 4.6.3 я продолжаю получать длинный список ошибок, например:

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);
        }
    }
}

Когда я искал в Интернете ошибки «недопустимый контекст», я получил ответы, что графический контекст можно получить только из функции-члена «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);
            }
        }
    }
}

person user1672637    schedule 20.07.2013    source источник
comment
Да, я явно вызываю drawRect. Я не понимал, что я не должен был.   -  person user1672637    schedule 21.07.2013
comment
Никогда не звоните drawRect:. Об этом даже говорится в документах для UIView drawRect:. Если вы хотите, чтобы представление снова отрисовывалось, вызовите setNeedsDisplay для представления. См. дубликат, на который ссылается Джош.   -  person rmaddy    schedule 21.07.2013


Ответы (1)


Ваш код очень близок! Однако код, который вы используете для создания экземпляра ChessBoard, неверен. Вместо использования «нового» (которого в любом случае следует избегать в 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];
}

Если вы попробуете это, вы должны увидеть, что ваш код рисования работает.

person Kris Schultz    schedule 21.07.2013
comment
Спасибо за помощь. Это в значительной степени сработало. - person user1672637; 21.07.2013