В настоящее время у меня есть класс, который появляется UIAlertView
здесь и там. В настоящее время тот же класс является делегатом для них (это очень логично, что это будет). К сожалению, эти UIAlertView
вызовут те же методы делегата класса. Теперь возникает вопрос: откуда вы знаете, из какого предупреждения вызывается метод делегата? Я думал просто проверить заголовок предупреждения, но это не так элегантно. Какой самый элегантный способ обработки нескольких UIAlertView
s?
Несколько UIAlertViews для делегата
Ответ 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
}