2011-10-05 5 views
2

J'essaie d'étendre le protocole UIAlertViewDelegate avec une méthode déléguée facultative.Protocole étendu UIAlertViewDelegate

Interface

@protocol HPAlertViewDelegate; 

@interface HPAlertView : UIAlertView<UIWebViewDelegate>{ 
    id <HPAlertViewDelegate> delegate; 
    UIWebView *webView; 
} 

@property (nonatomic, assign) id <HPAlertViewDelegate> delegate; 
@property (nonatomic, retain) UIWebView *webView; 


- (id)initWithWebURL:(NSString *)url title:(NSString *)aTitle; 

@end 

@protocol HPAlertViewDelegate <UIAlertViewDelegate> 

@optional 
- (void)HPAlertViewWebViewDidLoad:(HPAlertView *)alertView; 

@end 

mise en œuvre

@dynamic delegate 

quand je l'utilise dans MyViewController comme:

HPAlertView *alertView = [[HPAlertView alloc] initWithWebURL:myURL tile:myTitle]; 
[alertView setDelegate:self]; 

J'ai 2 questions:

  • si je mets délégué à @dynamic, mon délégué HPAlertView est toujours nulle même avec setDelegate: auto

  • si je mets délégué à @synthesize, mon Respond délégué uniquement aux nouvelles méthodes déléguées @optional et non aux méthodes déléguées UIAlertView.

+0

Je sais que ce n'est pas ce que vous demandez, mais vous ne devriez pas vraiment sous-classe 'UIAlertView'. – hypercrypt

Répondre

1

Essayez @synthesize puis mettre en œuvre le compositeur comme ceci:

- (void)setDelegate:(id)aDelegate { 
    super.delegate = aDelegate; 
    delegate = aDelegate; 
} 

Je suppose que @synthesize dans votre classe va générer une nouvelle variables d'instance nommée delegate qui est différent de la classe super delegate variable d'instance. Vous pouvez lire plus à ce sujet ici: http://cocoawithlove.com/2010/03/dynamic-ivars-solving-fragile-base.html

+0

Merci mais non, si je le fais, je vais générer une boucle infinie sur setDelegate (self.delegate = [self setDelegate], donc ....) –

+0

Ouais je viens de le remarquer et j'ai changé le code –

+0

Cela a-t-il fonctionné? juste curieux :) –