статический UIAlertView не вызывается willPresentAlertView

В приведенном ниже коде не вызывается метод 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");
    }
1
задан Peter Hosey 21 August 2010 в 05:37
поделиться

1 ответ

В Objective-C нет такой вещи, как статический метод, и классы хранения ваших переменных не имеют ничего общего с тем, что делает UIKit.

Вот что вы сделали:

  1. Вы реализовали метод класса и создали в нем предупреждение.
  2. В этом методе вы устанавливаете делегата предупреждения как self ; поскольку это метод класса, self - это класс, что означает, что вы устанавливаете делегатом предупреждения класс ShowAlert .
  3. Вы показали предупреждение. Поскольку делегат предупреждения - класс ShowAlert - не отвечает на willPresentAlertView: , предупреждение не пытается отправить это сообщение.

«Что!», - скажете вы. «Я реализовал willPresentAlertView:

Ну да, вы реализовали его как метод экземпляра . Таким образом, экземпляры ShowAlert отвечают на это сообщение. Но делегат предупреждения не является экземпляром ShowAlert; это сам класс ShowAlert, который не отвечает на это сообщение, потому что вы реализовали его как метод экземпляра, а не как метод класса.

Я не понимаю, зачем вы вообще сделали для этого класс. Разве все, что хочет показать предупреждение, не должно создавать, быть делегатом и отображать само предупреждение? Зачем ставить еще один класс между ними? (Обратите внимание, что классы обычно должны называться существительными, а не глаголами; имя этого класса «ShowAlert» подсказывает мне, что вы здесь что-то делаете не так.)

Если вы настаиваете на наличии этого класса, вы должен либо заставить каждый экземпляр создавать, быть делегатом и отображать UIAlertView (и, соответственно, сделать alert переменной экземпляра, а не статической переменной в файле реализации), либо заставить класс отвечать на willPresentAlertView: путем изменения вашей реализации метода экземпляра на метод класса.

2
ответ дан 2 September 2019 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: