Серьезная ошибка cgcontext: отрисовать bezierPath в initwithcoder?

Я хотел бы загрузить экземпляры класса, содержащего uibezierPath, и перерисовать эти предыдущие пути при запуске приложения. Словарь возвращает правильные экземпляры, но я не могу рисовать пути: представление создается в раскадровке, поэтому я использовал initWithCoder, если я использую viewDidLoad, этот метод не вызывается. И ошибка:

previousArrays : ({ firstPath = ""; }, { firstPath = ""; }, { firstPath = ""; }, { firstPath = ""; } ) 30 декабря 17:02:36 iPhone MyProject[1818] : CGContextAddPath: неверный контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека используют недопустимый контекст и тем самым способствуют общему снижению стабильности и надежности системы. Это уведомление любезно: пожалуйста, исправьте эту проблему. Это станет фатальной ошибкой в ​​следующем обновлении.

Вот мой код: (после касания путь сохраняется, затем при повторном запуске приложения появляется ошибка. Когда я рисую, проблем нет. Рисование пути работает. Это при возврате в приложение, и рисуя в initWithCoder, появляется проблема.)

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    UIBezierPath *bezierPath = [UIBezierPath bezierPathWithCGPath:myPath];//nscoding compliant
    DataForPath *firstPath = [[DataForPath alloc] init];
    firstPath.path = bezierPath;
    firstPath.colorInArray = @(currentColor);
    NSDictionary *dict = @{@"firstPath":firstPath};

    [SaveData saveData:dict];
}


-(id)initWithCoder:(NSCoder *)aDecoder{
    if ( !(self=[super initWithCoder:aDecoder])) return nil;
    //...
    myPath = CGPathCreateMutable();
    CGContextRef context = UIGraphicsGetCurrentContext();
    NSArray *previousArrays = [SaveData loadData];
    //NSLog("previousArrays : %@", previousArrays )...
    for ( NSDictionary*dict in previousArrays){
        UIBezierPath *eachPath = dict[@"path"];
        int color = [dict[@"colorInArray"] intValue];
        UIColor *objectColor = [self.possibleColor objectAtIndex:color];

        CGContextAddPath(context, eachPath.CGPath);
        CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor);
        CGContextDrawPath(context, kCGPathStroke);

        /*
        CGContextSetStrokeColorWithColor(context, objectColor.CGColor);
        CGContextSaveGState(context);
        [eachPath stroke];
        CGContextRestoreGState(context);
        */
    }
    return self;
}

РЕДАКТИРОВАТЬ: предыдущие пути в цикле for не рисуются?

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();

    if ( firstLaunchWithPreviousPaths ){
        for ( NSDictionary*dict in previousArrays){
            NSLog(@"firstLaunch"); //is called
            UIBezierPath *eachPath = dict[@"path"];

            CGContextAddPath(context, eachPath.CGPath);
            CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor);
            CGContextDrawPath(context, kCGPathStroke);
            //nothing is drawn?
        }
    }
    //with touchesEnd : this works
    /*
    CGContextAddPath(context, myPath);
    CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor);
    CGContextDrawPath(context, kCGPathStroke);
     */
}

person Paul    schedule 30.12.2014    source источник


Ответы (1)


Сообщение об ошибке сообщает вам о проблеме. Ты говоришь:

CGContextRef context = UIGraphicsGetCurrentContext();

Но в initWithCoder: нет текущего контекста.

Вы можете рисовать только в том месте, где есть графический контекст. Либо создайте его, либо переместите свой код туда, где он есть (например, drawRect:).

Или, если вы пытаетесь создать изменяемый CGPath, не делайте ссылок ни на какой графический контекст: работайте с путем, а не с контекстом. CGMutablePath имеет целый набор собственных функций для построения пути. Но, конечно, тогда вы не сможете его обвести или нарисовать — это просто путь. Вы сможете обвести или нарисовать его позже, когда у вас будет графический контекст; вы даете контексту путь, и теперь вы можете его обвести или нарисовать. Обводка и рисование — это то, что может происходить только в графическом контексте. А у тебя тут нет.

person matt    schedule 30.12.2014
comment
Спасибо, хорошо, мне нужно исправить некоторые проблемы, но я думаю, что это решает одну проблему. Спасибо - person Paul; 30.12.2014
comment
Да, я думаю, теперь вы легко сможете отследить эти другие проблемы с помощью хорошего ведения журнала / отладки. - person matt; 30.12.2014