2011-07-03 1 views
5

J'essaye de créer un UIViewController qui dessine une couche et cela fonctionne bien si ce UIViewController est le principal. Cependant, si je tente d'initialiser dans un autre contrôleur, puis l'ajouter est vue comme une vue sous de la vue principale du contrôleur, il en résulte l'erreur suivante:drawLayer: inContext - Sélecteur non reconnu envoyé à l'instance

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

Voici le code correspondant pour ma commande 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); 
    } 
} 

la méthode drawLayer est là et délégué du CALayer est auto.

Et voilà comment je l'appelle sur mon contrôleur principal:

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

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

que je fais pas la bonne façon? Je ne comprends pas pourquoi cela fonctionne bien si je dessine la couche sur mon contrôleur principal et qu'il en résulte une erreur si le dessin est fait sur PDFViewController. La méthode est là, le délégué est auto. Alors pourquoi le sélecteur échoue-t-il?

+0

Cela ressemble à un problème de gestion de la mémoire. Avez-vous essayé NSZombieEnabled? Y a-t-il une chance que vous ayez sur-publié quelque chose? Utilisez-vous ARC? – jtbandes

+0

@jbandes - Merci beaucoup! Avec NSZombieEnabled j'ai vu comme vous l'avez dit que le message a été envoyé à une instance désaffectée de mon contrôleur de vue et j'ai ensuite procédé pour corriger la sur-libération. S'il vous plaît poster une réponse à cette question afin que je puisse le marquer et vous pouvez prendre la prime. – Raphael

+0

Merci, je suis heureux de pouvoir vous aider! Je pense que vous devez assigner séparément la prime, en la marquant comme la réponse ne l'attribue pas. – jtbandes

Répondre

3

[réaffiché des commentaires parce qu'il est avéré être la réponse!]

Cela ressemble à un problème de gestion de la mémoire. Avez-vous essayé NSZombieEnabled? Y a-t-il une chance que vous ayez sur-publié quelque chose? Utilisez-vous ARC?

Questions connexes