• Александр Черный
  • Блог
  • Проекты
  • О себе
  • RSS
14 ноября 2010

UIAlertView

UIAlertView — это способ показать всплывающее окошко. Такое, как дает alert() в JavaScript. Такое, как дает MessageBox() из WinAPI. Когда-то, для упрощения процесса создания таких диалогов были даже специальные утилиты (например, Message Box Editor), генерирующие код для Delphi, Visual Basic, C++ Builder. Они были полезны, так как с ними можно было не помнить константы для обозначения кнопок и картинки, а также не писать switch для обработки нажатия каждой кнопки.

В iOS есть класс UIAlertView. У него есть конструктор initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:, который, скорее всего, решит задачу в большинстве случаев. Указывает заголовок окна, текст сообщения, обрабатывающий нажатие на кнопки класс, сами кнопки.

UIAlertView* alert = [[[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"Cancel button" otherButtonTitles:nil] autorelease];
[alert show];

Объявили указатель. Выделили память под объект и инициализировали его. Простое правило: если вам что-то не нужно, передавайте nil. Не нужно сообщение — message:nil. Сообщение уведомительное и не нужна обработка нажатия кнопок — delegate:nil.

Если нужно больше кнопок — укажите их заголовки через запятую в виде NSString и завершите перечисление nil. Если не написать nil в конце, будет warning: «Missing sentinel in function call».

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"B1", @"B2", nil];
[alert show];
[alert release];

Обработка нажатий осуществляется добавлением метода к тому делегату, который был указан. Каждая кнопка имеет свой индекс. Кнопка отмены имеет индекс 0, индексы остальным кнопкам присватываются в том порядка, в котором они перечислены, если это специально не изменено. Если в качестве делегата выбран self, добавьте к нему следующий метод.

- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
	NSLog(@"Index - %i, title - %@", buttonIndex, [alertView buttonTitleAtIndex:buttonIndex]);
}

Он будет писать в консоль индекс нажатой кнопки и ее заголовок. Вызвать консоль можно через меню: Run → Console. Если нужно обработать нажатие каждой кнопки в отдельности, пишите ветвление.

Бывает, нужно скрыть UIAlertView не дожидаясь нажатия на кнопку, например, по истечении какого-то времени. Для этого используйте метод dismissWithClickedButtonIndex:animated:.

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"B1", @"B2", nil];
[alert show];
[alert dismissWithClickedButtonIndex:0 animated:YES];
[alert release];

Сообщение появится и сразу же исчезнет, как будто пользователь нажал Cancel.

  1. Официальная документация по UIAlertView
  2. Демонстрационный код

ios   uialertview   

Ваш комментарий


(не будет опубликован)


© Александр Черный, 2009–2026

Служебный вход

Работает на YAPSE, β