UIAlertViewDelegate расширенный протокол - PullRequest
2 голосов
/ 05 октября 2011

Я пытаюсь расширить протокол 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: self

  • если я назначу делегату значение @synthesize, мой делегат отвечает только на новые методы делегирования @optional, а не на методы делегата UIAlertView.

1 Ответ

1 голос
/ 05 октября 2011

Попробуйте @synthesize, а затем реализуйте установщик следующим образом:

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

Я думаю, @synthesize в вашем классе сгенерирует новые переменные экземпляра с именем delegate, которые отличаются от переменной экземпляра суперкласса delegate. Вы можете прочитать больше об этом здесь: http://cocoawithlove.com/2010/03/dynamic-ivars-solving-fragile-base.html

...