В приведенном ниже коде не вызывается метод willPresentAlertView. Почему? Метод статический? или Значение Alert является статическим?
@interface ShowAlert : NSObject <UIAlertViewDelegate>
static UIAlertView* alert;
+(void) showAlert:(NSString*) msg{
alert = [[UIAlertView alloc] initWithTitle:nil message:[NSString stringWithFormat:@"%@", msg] delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
[alert show];
}
- (void)willPresentAlertView:(UIAlertView *)alertView {
NSLOG(@"willPresentAlertView");
}
В Objective-C нет такой вещи, как статический метод, и классы хранения ваших переменных не имеют ничего общего с тем, что делает UIKit.
Вот что вы сделали:
self
; поскольку это метод класса, self
- это класс, что означает, что вы устанавливаете делегатом предупреждения класс ShowAlert
. willPresentAlertView:
, предупреждение не пытается отправить это сообщение. «Что!», - скажете вы. «Я реализовал willPresentAlertView:
!»
Ну да, вы реализовали его как метод экземпляра . Таким образом, экземпляры ShowAlert отвечают на это сообщение. Но делегат предупреждения не является экземпляром ShowAlert; это сам класс ShowAlert, который не отвечает на это сообщение, потому что вы реализовали его как метод экземпляра, а не как метод класса.
Я не понимаю, зачем вы вообще сделали для этого класс. Разве все, что хочет показать предупреждение, не должно создавать, быть делегатом и отображать само предупреждение? Зачем ставить еще один класс между ними? (Обратите внимание, что классы обычно должны называться существительными, а не глаголами; имя этого класса «ShowAlert» подсказывает мне, что вы здесь что-то делаете не так.)
Если вы настаиваете на наличии этого класса, вы должен либо заставить каждый экземпляр создавать, быть делегатом и отображать UIAlertView (и, соответственно, сделать alert
переменной экземпляра, а не статической переменной в файле реализации), либо заставить класс отвечать на willPresentAlertView:
путем изменения вашей реализации метода экземпляра на метод класса.