ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C часть 2

Выпадающее меню (UIActionSheet)

Для начала создадим проект на базе View Based Application и назовём его ActSheetTutorial.

Теперь перейдем в файл ActSheetTutorialViewController.h и подключим делегат UIActionSheet:

 

<code data-result="[object Object]">#import &lt;UIKit/UIKit.h&gt;

@interface ActSheetTutorialViewController : UIViewController &lt;UIActionSheetDelegate&gt; {

}

@end</code>

 

Это нужно для того, чтобы мы могли «ловить» нажатия кнопок. Перейдем к файлу ActSheetTutorialViewController.m, раскомментируйте метод -(void)viewDidLoad; и проинициализируйте UIActionSheet:

 

<code data-result="[object Object]">- (void)viewDidLoad
{
    [super viewDidLoad];
    UIActionSheet *actSheet = [[UIActionSheet alloc] initWithTitle:@"Заголовок" 
                                                          delegate:self 
                                                 cancelButtonTitle:@"Кнопка отмены" 
                                            destructiveButtonTitle:@"Красная кнопка" 
                                                 otherButtonTitles:@"Другая кнопка",nil];
    [actSheet showInView:self.view];
    [actSheet release];
}</code>

 

cancelButtonTitle — Заголовок кнопки отмены

destructiveButtonTitle — Заголовок красной кнопки

otherButtonTitles — Массив других кнопок

 

Разные кнопки имеют разный вид:

 

 

 

Есть также свойство actionSheetStyle позволяющее менять вид меню:

 

  • UIBarStyleDefault
  • UIBarStyleBlackOpaque
  • UIBarStyleBlackTranslucent

 

 

Изменим код метода viewDidLoad с применением первого стиля:

<code data-result="[object Object]">- (void)viewDidLoad
{
    [super viewDidLoad];
    UIActionSheet *actSheet = [[UIActionSheet alloc] initWithTitle:@"Заголовок" 
                                                          delegate:self 
                                                 cancelButtonTitle:@"Кнопка отмены" 
                                            destructiveButtonTitle:@"Красная кнопка" 
                                                 otherButtonTitles:@"Другая кнопка",nil];
    actSheet.actionSheetStyle = UIActionSheetStyleDefault;
    [actSheet showInView:self.view];
    [actSheet release];
}</code>

 

Запустите приложение и проверьте его работу. Мы сделали простой UIActionSheet но он ничего не делает. Чтобы мы могли обрабатывать нажатия кнопок добавим метод clickedButtonAtIndex:

 

<code data-result="[object Object]">-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSString *clickedButtonString = [NSString stringWithFormat:@"Кнопка по индексу %d была нажата",buttonIndex];
    NSLog(@"%@", clickedButtonString);
}</code>

 

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

 

Кнопка по индексу 0 была нажата

 

 

 

Чтобы отобразить текст кнопки которая была нажата достаточно написать

 

<code data-result="[object Object]">NSLog(@"%@", [actionSheet buttonTitleAtIndex:buttonIndex]);</code>

 

А что делать если UIActionSheet много а делегат один, как их различать. Для этих целей можно использовать теги. Это подобно тому как мы работали с алертами. Вернёмся к методу viewDidLoad и присвоим нашему меню тег. Тег может иметь только значение целого числа без отрицательного показателя.

 

<code data-result="[object Object]">actSheet.tag = 1;</code>

 

А чтобы код прописанный в clickedButtonAtIndex относился только к этому UIActionSheet пропишем там проверку на тег:

 

<code data-result="[object Object]">-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    if(actionSheet.tag == 1) {
        NSLog(@"%@ (Кнопка по индексу %d)",[actionSheet buttonTitleAtIndex:buttonIndex],buttonIndex);
    } else {
        //Если это другой UIActionSheet
    }
}</code>

 

Соответственно, если у вас больше двух UIActionSheet:

 

<code data-result="[object Object]">-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    switch (actionSheet.tag) {
        case 1:
            //Для UIActionSheet с тегом 1
            break;
        case 2:
            //Для UIActionSheet с тегом 2
            break;
        case 3:
            //Для UIActionSheet с тегом 3
            break;
        default:
            //Если никакой UIActionSheet не подошёл под условие
            break;
    }
}</code>

 

Исходный код можно скачать здесь.