В одной из недавних статей об iOS мы говорили об UIAlertView, как способе показать всплывающее сообщение и предложить пользователю несколько вариантов действий. В UIKit существует еще один способ показать варианты действий пользователю — UIActionSheet. Если UIAlertView направлено на показ сообщения, то UIActionSheet направлен именно на выбор варианта.

Для подготовки этой статьи использовался XCode 4.2 и iOS5 SDK. Чтобы у вас работал исходный проект — необходимо обновиться, если у вас более старая версия.

Начало

Мы можем показать UIActionSheet с одной кнопкой, но так как нам следует предоставить пользователю вариант выбора, то всегда должна быть кнопка отменяющая действие (чаще всего Отмена). Кнопка отмены выделяет отдельным цветом от остальных. Так же UIActionSheet может содержать «разрушительную» кнопку (чаще всего Удалить, Убрать либо похожее), такая кнопка тоже отделяется цветом — красным.

Итак, UIActionSheet с двумя кнопками — просто кнопка и «Отмена»:

UIActionSheet* actionSheet = [[UIActionSheet alloc] initWithTitle:@"Это ActionSheet"

delegate:nil
cancelButtonTitle:@"Отмена"
destructiveButtonTitle:nil
otherButtonTitles:@"Просто кнопка", nil];
[actionSheet showInView:self.view];

Разберем то, что написано выше. На первой строчке создается сам UIActionSheet. В конструктор мы передаем сообщение и тайтлы кнопок. В данном примере у нас две кнопки — «Отмена» и «Просто кнопка». Обратите внимание, что кнопка «Отмена» определяется параметром cancelButtonTitle и она может быть только одна (это касается и «разрушительной» кнопки). Остальные кнопки перечисляются через запятую в otherButtonTitles. Вот, что у нас вышло:

Красная кнопка

Теперь добавим красную кнопку в UIActionSheet:

UIActionSheet* actionSheet = [[UIActionSheet alloc] initWithTitle:@"Это ActionSheet"

delegate:nil
cancelButtonTitle:@"Отмена"
destructiveButtonTitle:@"Красная кнопка"
otherButtonTitles:@"Просто кнопка", nil];
[actionSheet showInView:self.view];

Обратим внимание, что красная кнопка может быть только одна и задается параметром destructiveButtonTitle.

Несколько кнопок

В параметре otherButtonTitles мы можем задать несколько кнопок. Тайтлы всех кнопок перечисляются через запятую и заканчиваются ключевым словом nil.

UIActionSheet* actionSheet = [[UIActionSheet alloc] initWithTitle:@"Это ActionSheet"

delegate:nil
cancelButtonTitle:@"Отмена"
destructiveButtonTitle:nil
otherButtonTitles:@"Просто кнопка",@"Еще одна кнопка",@"Кнопка", nil];
[actionSheet showInView:self.view];

А что, если на момент создания UIActionSheet мы еще не определились с количеством кнопок? Мы можем добавлять кнопки в уже созданный UIActionSheet!

UIActionSheet* actionSheet = [[UIActionSheet alloc] init];

[actionSheet setTitle:@"Это ActionSheet"];
for( int i=0; i<3; i++ )
[actionSheet addButtonWithTitle:[NSString stringWithFormat:@"Кнопка #%d",(1+i)]];
[actionSheet showInView:self.view];

В этом примере мы просто создали UIActionSheet, задали тайтл, а затем добавили 3 кнопки.

В этом примере мы не задали кнопку отмены. Сделать это можно следующим образом (добавьте код после цикла):

[actionSheet addButtonWithTitle:@"Отмена"];

[actionSheet setCancelButtonIndex:actionSheet.numberOfButtons-1];

Обратите внимание, что кнопки добавляются сверху вниз, а номера идут с низу вверх. Таким же способом мы можем задать номер «разрушительной» кнопки. Делается это через метод setDestructiveButtonIndex:.

Как показать UIActionSheet

Во всех предыдущих примерах вы можете заметить строчку:

[actionSheet showInView:self.view];

Мы ее оставили без внимания. Метод showInView: показывает UIActionSheet из заданной UIView.

Так же мы можем использовать следующие методы для показа UIActionSheet:

- (void)showFromToolbar:(UIToolbar *)view;

- (void)showFromTabBar:(UITabBar *)view;
- (void)showFromBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated;
- (void)showFromRect:(CGRect)rect inView:(UIView *)view animated:(BOOL)animated;

Первый метод показывает UIActionSheet из UIToolbar, второй — из UITabBar, третий из кнопки UIBarButtonItem, четвертый из прямоугольника CGRect в UIView.

Определяем на какую кнопку нажал пользователь

На протяжении чтения статьи, возможно, у вас возник вопрос — а как узнать, куда нажал пользователь? Для этого нужно определить делегат UIActionSheetDelegate и реализовать в нем метод

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex;

Рассмотрим пример:

- (IBAction)delegateButtonTouched:(id)sender {

UIActionSheet* actionSheet = [[UIActionSheet alloc] initWithTitle:@"AlertSheet"
delegate:self
cancelButtonTitle:@"Отмена"
destructiveButtonTitle:@"Красная кнопка"
otherButtonTitles:@"Кнопка",@"Еще кнопка", nil];
[actionSheet showInView:self.view];
[actionSheet release];
}
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
NSLog(@"Была нажата кнопка с номером - %d",buttonIndex);
}

В этом примере мы установили свойство delegate у UIActionSheet тому же классу, в котором создается UIActionSheet.

Метод actionSheet:clickedButtonAtIndex: будет вызыван после нажатия любой из кнопок. Так же, у UIActionSheet есть два свойства в которых содержится индекс кнопки отмены и красной кнопки — cancelButtonIndex и destructiveButtonIndex.

Загрузить работающий проект можно тут.

Еще почитать

  • Audio Unit в iOS. Часть 3, накладываем эффект Delay

  • Audio Unit в iOS. Часть 2, строим граф и проигрываем файлы

  • Audio Unit в iOS. Часть 1, введение.

  • Используем Emoji в своих приложениях

  • Как вводить в UITextField только цифры?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *