2011-10-05 109 views
2

我想用一个可选的委托方法扩展UIAlertViewDelegate协议。UIAlertViewDelegate扩展协议

接口

@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 

实施

@dynamic delegate 

当我使用它在myViewController像:

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

我有2个问题:

  • 如果我委托设为@dynamic,我在HPAlertView委托总是空,即使setDelegate:自

  • 如果我委托设为@synthesize,我代表响应仅适用于新的@optional委托方法,而不适用于UIAlertView委托方法。

+0

我知道这不是你要求的,但你不应该真的继承'UIAlertView'。 – hypercrypt

回答

1

尝试@synthesize,然后实现setter方法,因为这:

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

我猜@synthesize你们班会生成一个名为delegate是从超类delegate实例变量不同的一个新的实例变量。你可以在这里阅读更多关于这个:http://cocoawithlove.com/2010/03/dynamic-ivars-solving-fragile-base.html

+0

谢谢,但没有,如果我这样做,我会在setDelegate上产生无限循环(self.delegate = [self setDelegate],所以....) –

+0

是的,我刚刚注意到并更改了代码 –

+0

它工作吗?只是好奇:) –