UIAlertViewDelegate扩展协议

时间:2011-10-05 00:18:10

标签: iphone objective-c delegates protocols uialertview

我正在尝试使用一个可选的委托方法扩展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委托方法。

1 个答案:

答案 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