我正在尝试使用一个可选的委托方法扩展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];
我有两个问题:
如果我将委托设置为@dynamic,即使使用setDelegate,HPAlertView中的委托也始终为null:self
如果我将委托设置为@synthesize,我的委托只响应新的@optional委托方法而不响应UIAlertView委托方法。
答案 0 :(得分:1)
尝试@synthesize
,然后按以下方式实施设置器:
- (void)setDelegate:(id)aDelegate {
super.delegate = aDelegate;
delegate = aDelegate;
}
我猜你的类中的@synthesize
将生成一个名为delegate
的新实例变量,它与超类delegate
实例变量不同。您可以在此处详细了解:http://cocoawithlove.com/2010/03/dynamic-ivars-solving-fragile-base.html