2010-04-09 4 views
0

Dans une application pour iPad, j'utilise une sous-classe personnalisée de UIView avec UIViewController. Voici l'en-tête de vue:Effacement des avertissements "ne répond pas" pour UIView et UIViewController

@interface pdfView : UIView { 
    CGPDFDocumentRef doc; 
} 

-(void)setDoc:(CGPDFDocumentRef)newDoc; 

@end 

Et voici l'en-tête du contrôleur:

@interface iPadPDFTestViewController : UIViewController { 
    CGPDFDocumentRef doc; 
} 

- (void)loadPDF; 

@end 

Une partie de la mise en œuvre du contrôleur:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self loadPDF]; 
    [self.view setDoc:doc]; 
} 

Dans Interface Builder, j'ai mis l'objet en vue de utilise la classe pdfView.

compilation A, [self.view setDoc:doc]; donne l'avertissement "UIView» ne peut pas répondre à '--setDoc'." Je devine que cet avertissement apparaît parce que le compilateur pense qu'il regarde UIView (qui n'implémente pas la méthode setDoc) au lieu de pdfView. Mais pourquoi pense-t-il cela? Et comment puis-je dire à quelle classe il regarde vraiment, de manière à effacer l'avertissement?

Répondre

5

Le compilateur ne connaît que ce que le code définit et un UIViewController définit sa propriété view comme un UIView, ce qui explique la présence d'avertissements.

Vous pouvez éviter les avertissements en affichant la vue sur votre PDFView: (PDFView *) self.view;

Pour vous simplifier la tâche mettre en œuvre une méthode de lecture de base

- (PDFView *)view { 
    return (PDFView *)self.view; 
} 

Aussi, tout comme une note de côté, vous devez nommer vraiment vos classes afin qu'ils commencent par atleast un omble chevalier en majuscules, et idéalement un préfixe (c.-à-PDFView , idéalement MYPDFView (où MY est un préfixe personnalisé)).

+1

Pour un traitement plus approfondi du point important de @ dannywartnaby sur le préfixage des noms de classe dans Objective-C pour éviter les collisions d'espaces de noms: http://stackoverflow.com/questions/178434/what-is-the-best-way-to- solve-an-objective-c-namespace-collision –

+0

Merci! Cela a fonctionné comme un charme. Votre explication a été très utile - je vois maintenant que le compilateur obtient ses informations de type à partir de la définition de la propriété 'view'. Ce que je fais maintenant est ceci: '[(PDFView *) self.view setDoc: doc];' – rlkw1024

Questions connexes