2014-10-27 2 views
1

Это, вероятно, основной вопрос новичков, но я застрял на этом. Попытка настроить Core Plot, но есть некоторые проблемы.NSGraphicsContext currentContext возвращает nil

Посмотрев на CPTestApp, я пытаюсь просто нарисовать что-либо, но всегда получаю крах в CPTPlatformSpecificFunctions, потому что NSGraphicContext равен нулю.

void CPTPushCGContext(CGContextRef newContext) 
{ 
    if (newContext) { 
     if (!pushedContexts) { 
      pushedContexts = [[NSMutableArray alloc] init]; 
     } 
     [pushedContexts addObject:[NSGraphicsContext currentContext]]; 
     [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:newContext flipped:NO]]; 
    } 
} 

Почему [NSGraphicsContext currentContext] возвращает nil? Буду признателен за любые намеки. Демо-приложение, похоже, вызывает init из делегата приложения, подобного мне.

EDIT, вот мой вызов Coreplot:

ApplicationDeletegate.h

#import <CorePlot/CorePlot.h> 

@property (nonatomic, readwrite, strong) IBOutlet CPTGraphHostingView *graphHostView; 

ApplicationDeletegate.m (да, я знаю, вы не должны так много кода здесь)

-(void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    [self setupGraph]; 
} 

-(void)setupGraph 
{ 

    CPTGraph *graph = [[CPTXYGraph alloc] initWithFrame:graphHostView.bounds]; 
    graph.plotAreaFrame.masksToBorder = NO; 
    graphHostView.hostedGraph = graph; 

    [graph applyTheme:[CPTTheme themeNamed:kCPTPlainBlackTheme]]; 
    graph.paddingBottom = 30.0f; 
    graph.paddingLeft = 30.0f; 
    graph.paddingTop = -1.0f; 
    graph.paddingRight = -5.0f; 

    CPTMutableTextStyle *titleStyle = [CPTMutableTextStyle textStyle]; 
    titleStyle.color = [CPTColor whiteColor]; 
    titleStyle.fontName = @"Helvetica-Bold"; 
    titleStyle.fontSize = 16.0f; 

    NSString *title = @"Portfolio Prices: April 23 - 27, 2012"; 
    graph.title = title; 
    graph.titleTextStyle = titleStyle; 
    graph.titlePlotAreaFrameAnchor = CPTRectAnchorTop; 
    graph.titleDisplacement = CGPointMake(0.0f, -16.0f); 

} 

Is awakeFromNib слишком рано? Я что-то пропустил?

+0

Убедитесь, что все взаимодействия с Основным участком происходят в основном потоке (установки, источник данных и т.д.) , Пожалуйста, разместите свой установочный код графика. –

+0

добавил мой супер базовый код установки. – jannej

+0

Код, который вы отправили, выглядит отлично. Какую версию Core Plot, Xcode и OS X вы используете? –

ответ

0

Возможно, у вас нет текущейContext прямо сейчас? Вы устанавливаете один, так что просто измените свой код, чтобы не нажимать, если его нет. После этого проверьте, что это приводит к тому, что currentContext возвращает объект, на который вы его установили.

} 
NSGraphicsContext *ctx = [NSGraphicsContext currentContext]; 
if(ctx != nil) { 
    [pushedContexts addObject: ctx]; 
} 
[NSGraph..... 

Также проверьте свой поп, чтобы убедиться, что он не делает ничего глупого, если у вас закончились толкаемыеконтексты.

+0

Спасибо за ваш ответ! Этот фрагмент кода поступает от CorePlot, поэтому я предположил, что контекст был позабочен. Должен ли я создавать контекст? Я не вижу ничего в создании контекстов в примерах. – jannej

+0

Похоже, вы столкнулись только с проблемой, которую вы описываете, когда откуда-то вы получили контекст и называете функцию CPTPushCGContext. Как это используется в примере? – KirkSpaziani

+0

CPTPushCGContext называется глубоко в коде CorePlot. Никогда не звонил напрямую. Я не уверен, что мои проблемы с currentContext связаны с CorePlot или нет. – jannej

2

Возможно, вы звоните за пределы drawRect: call chain. Когда это происходит, даже если вы получаете currentContext, графические объекты или CGContexts (OS X 10.0 и более поздние версии) не настроены.

На уровне представления, вызовите

[<view> lockFocus]; 
<your call to munge the context> 
[<view> unlockFocus]; 

где вид является видом вы рисуете в.

Смежные вопросы