Подтвердить что ты не робот

Несколько UIAlertViews для делегата

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

4b9b3361

Ответ 1

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

#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) {
        // ...
    }
}

Ответ 2

FYI, если вы хотите нацелить только пользователей iOS 4 (что разумно теперь, когда ~ 98.5% клиентов имеют хотя бы iOS 4, установленный), вы должны иметь возможность использовать блоки для выполнения действительно приятной встроенной обработки UIAlertViews.

Здесь возникает вопрос Stackoverflow, объясняющий это:
Блок для UIAlertViewDelegate

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

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

Ответ 3

проще и новее

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...
    }
}

все сделано!

Ответ 4

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

Ответ 5

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

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

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

@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
  }