cgcontext严重错误:在initwithcoder中绘制bezierPath?

时间:2014-12-30 16:08:40

标签: ios objective-c core-graphics cgcontext uibezierpath

我想加载包含uibezierPath的类的实例,并在应用程序启动时重绘这些先前的路径。字典返回正确的实例,但我无法绘制路径:视图是在故事板中创建的,所以我使用了initWithCoder,如果我使用viewDidLoad,则不会调用此方法。错误是:

  

previousArrays :(           {           firstPath =“”;       },           {           firstPath =“”;       },           {           firstPath =“”;       },           {           firstPath =“”;       }   )   12月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);
     */
}

1 个答案:

答案 0 :(得分:2)

错误消息告诉您问题。你在说:

CGContextRef context = UIGraphicsGetCurrentContext();

initWithCoder:中有没有当前上下文。

您只能在有图形上下文的地方绘图。制作一个,或将代码移动到有一个代码的位置(例如drawRect:)。

或者,如果您正在尝试构建可变CGPath,请不要引用任何图形上下文:使用路径,而不是上下文。 CGMutablePath有一整套用于构造路径的函数。但是当然你不能抚摸或画它 - 它只是一个路径。当你有图形上下文时,你将能够在以后描边或绘制它;你给上下文路径和现在你可以描边或绘制它。描边和绘图只能在图形上下文中发生。而你在这里没有。