статический UIAlertView не называется willPresentAlertView - PullRequest
1 голос
/ 20 августа 2010

В приведенном ниже коде не вызывается метод 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 Ответ

2 голосов
/ 21 августа 2010

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

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

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

«Что!», Говорите вы.«Я реализовал willPresentAlertView:

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

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

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

...