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.
Ваш комментарий