Несколько UIAlertViews для делегата - PullRequest
38 голосов
/ 26 февраля 2010

В настоящее время у меня появляется класс UIAlertView здесь и там. В настоящее время один и тот же класс является их делегатом (это очень логично). К сожалению, эти UIAlertView будут вызывать одни и те же методы делегата класса. Теперь возникает вопрос: как узнать, из какого вида оповещения вызывается метод делегата? Я думал просто проверить заголовок окна с предупреждением, но это не так уж и элегантно. Какой самый элегантный способ справиться с несколькими UIAlertView с?

Ответы [ 5 ]

102 голосов
/ 26 февраля 2010

Отметьте UIAlertView s следующим образом:

#define kAlertViewOne 1
#define kAlertViewTwo 2

UIAlertView *alertView1 = [[UIAlertView alloc] init...
alertView1.tag = kAlertViewOne;

UIAlertView *alertView2 = [[UIAlertView alloc] init...
alertView2.tag = kAlertViewTwo;

, а затем различать их в методах делегатов, используя следующие теги:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if(alertView.tag == kAlertViewOne) {
        // ...
    } else if(alertView.tag == kAlertViewTwo) {
        // ...
    }
}
4 голосов
/ 16 апреля 2012

К вашему сведению, если вы хотите настроить таргетинг только на пользователей iOS 4 (что вполне разумно теперь, когда на 98,5% клиентов установлена ​​хотя бы iOS 4 ), вы должны иметь возможность использовать блоки для действительно приятного встроенная обработка UIAlertViews.

Вот вопрос Stackoverflow, объясняющий это:
Блок для UIAlertViewDelegate

Я попытался использовать для этого фреймворк Zachary Waldowski's BlocksKit. Его справка по UIAlertView (BlocksKit) API выглядела очень хорошо. Однако я пытался следовать его инструкциям по импорту инфраструктуры BlocksKit в мой проект, но, к сожалению, я не смог заставить его работать.

Итак, как предлагает Can Berk Güder, я использовал теги UIAlertView на данный момент. Но в какой-то момент в будущем я попытаюсь перейти к использованию блоков (желательно с поддержкой ARC из коробки)!

3 голосов
/ 11 августа 2013

проще и новее

UIAlertView *alert = [[UIAlertView alloc] init...
alert.tag = 1;

UIAlertView *alert = [[UIAlertView alloc] init...
alert.tag = 2;



- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if(alertView.tag == 1) {
        // first alert...
    } else  {
        // sec alert...
    }
}

все готово!

1 голос
/ 01 февраля 2013

Вы можете преодолеть все это испытание и помешать себе использовать теги, улучшив UIAlertView для использования обратных вызовов блока. Прочтите это сообщение в блоге Я написал на эту тему.

0 голосов
/ 11 августа 2015

Я всегда думал, что использование тегов - это что-то вроде хака. Если вы их используете, по крайней мере установите некоторые определенные константы для номеров тегов.

Вместо этого я использую такие свойства:

В разделе интерфейса:

@property (nonatomic, weak) UIAlertView *overDueAlertView;
@property (nonatomic, weak) UIAlertView *retryPromptAlertView;

Создание вида оповещения:

UIAlertView *alert = [[UIAlertView alloc] init...
self.overDueAlertView = alert;
[alert show];

Метод делегата:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
  if (alertView == self.overDueAlertView) {
    // Overdue alert
  } else if (alertView == self.retryPromptAlertView) {
    // Retry alert
  }
...