2011-07-03 110 views
5

我試圖創建一個繪製圖層的UIViewController,並且如果此UIViewController是主圖層,它工作正常。但是,如果我嘗試初始化它的另一個控制器中,然後添加它的視圖作爲主控制器的觀點,它導致以下錯誤的子觀點:drawLayer:inContext - 發送到實例的無法識別的選擇器

-[__NSCFType drawLayer:inContext:]: unrecognized selector sent to instance 0x155140 

這裏是我的自定義的UIViewController的相關代碼(PDFPageViewController ):

- (void)loadDocument:(PDFDocument *)document 
{ 
    self._document = document; 

    CGRect pageRect = CGRectIntegral(CGPDFPageGetBoxRect(self._document.page, kCGPDFCropBox)); 

    pageRect.origin.x = (self.view.frame.size.width/2) - (pageRect.size.width/2) - 35; 

    CATiledLayer *tiledLayer = [CATiledLayer layer]; 
    tiledLayer.delegate = self; 
    tiledLayer.tileSize = CGSizeMake(1024.0, 1024.0); 
    tiledLayer.levelsOfDetail = 1000; 
    tiledLayer.levelsOfDetailBias = 1000; 
    tiledLayer.frame = pageRect; 

    contentView = [[UIView alloc] initWithFrame:pageRect]; 
    [contentView.layer addSublayer:tiledLayer]; 

    CGRect viewFrame = self.view.frame; 
    viewFrame.origin = CGPointZero; 

    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:viewFrame]; 
    scrollView.delegate = self; 
    scrollView.contentSize = pageRect.size; 
    scrollView.maximumZoomScale = 1000; 
    [scrollView addSubview:contentView]; 

    [self.view addSubview:scrollView]; 

    NSLog(@"%@", self); // Just checking if there's nothing overwriting the layer's delegate 
} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return contentView; 
} 

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{ 
    if(self._document) { 
     CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0); 
     CGContextFillRect(ctx, CGContextGetClipBoundingBox(ctx)); 
     CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height); 
     CGContextScaleCTM(ctx, 1.0, -1.0); 
     CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(self._document.page, kCGPDFCropBox, layer.bounds, 0, true)); 
     CGContextDrawPDFPage(ctx, self._document.page); 
    } 
} 

drawLayer方法是存在的,該CALayer的的委託是

這是我怎麼稱呼它在我的主控制器上:

pageViewController = [[[PDFPageViewController alloc] initWithNibName:NULL bundle:NULL] autorelease]; 
[pageViewController loadDocument:self.document]; 

[self.view addSubview:[pageViewController view]]; 

我不能這樣做的正確方法?我不明白爲什麼這個工作正常,如果我在我的主控制器上繪製圖層,並且如果繪製在PDFViewController上,則會導致錯誤。方法在那裏,代表是self。那麼爲什麼選擇器失敗?

+0

這聽起來像是內存管理問題。你有沒有試過NSZombieEnabled?有沒有機會過度發佈某些東西?你在使用ARC嗎? – jtbandes

+0

@jbandes - 非常感謝!在NSZombieEnabled中,我看到了正如你所說的那樣,這條消息已經發送到了我的視圖控制器的一個解除分配的實例,然後我開始修復過度釋放。請張貼這個問題的答案,以便我可以標記它,你可以獲得賞金。 – Raphael

+0

謝謝,很高興我能幫忙!我認爲你必須單獨分配賞金,只是將它標記爲答案不分配它。 – jtbandes

回答

3

[從註釋中重新發布,因爲它原來是答案!]

這聽起來像一個內存管理問題。你有沒有試過NSZombieEnabled?有沒有機會過度發佈某些東西?你在使用ARC嗎?

相關問題