Статьи

Быстрый совет для iOS: создайте динамический лист действий

Добро пожаловать в этот быстрый совет начального уровня о работе с листами действий. Из этого руководства вы узнаете, как динамически создавать простую таблицу действий с использованием содержимого из массива. Этот метод позволит вам определить, сколько кнопок нужно разместить на листе действий во время выполнения, а не во время компиляции. Удобная техника, чтобы иметь!

В этом уроке мы создадим простое приложение, которое покажет нам список фруктов на листе действий. Если вы выберете фрукт, текст метки будет обновлен с выбранным фруктом.


Откройте Xcode и выберите «Создать новый проект Xcode». Выберите «Single View Application» и нажмите «Next». Введите имя для своего проекта (я назвал его «Фрукты»), убедитесь, что вы выбрали iPhone для «Устройств» и отметили флажки «Использовать раскадровки» и «Использовать автоматический подсчет ссылок». После этого нажмите «Далее» и выберите место для сохранения вашего проекта, прежде чем нажать «Создать».

Создать проект

Мы хотим использовать это приложение только в портретном режиме, поэтому перейдите в раздел «Поддерживаемые ориентации интерфейса» и отмените выбор ориентации ландшафта.

Поддерживаемые ориентации

Откройте раскадровку и перетащите метку из библиотеки объектов в контроллер вида. Разместите его в верхней части View Controller и убедитесь, что он центрирован и имеет ширину 280 пикселей. Откройте инспектор атрибутов и измените выравнивание по центру. Наконец, удалите текст.

Затем перетащите кнопку из библиотеки объектов на контроллер вида и поместите ее чуть ниже метки. Дважды щелкните по его названию и измените его на «Фрукты».

Интерфейс

Откройте ViewController.m и измените код следующим образом:

01
02
03
04
05
06
07
08
09
10
#import «ViewController.h»
 
@interface ViewController () <UIActionSheetDelegate>
 
@property(nonatomic, weak) IBOutlet UILabel *fruitLabel;
@property(nonatomic, strong) NSMutableArray *fruits;
 
— (IBAction)showFruits:(id)sender;
 
@end

Здесь мы создаем выход для нашей этикетки, изменяемый массив для хранения наших фруктов, и мы создаем действие, чтобы показать лист действий. Мы также добавили UIActionSheetDelegate , чтобы мы могли обновить метку, когда вы выбираете фрукт из листа действий. Обратите внимание, что все это было сделано в расширении класса, потому что ни одно из этих свойств или методов не должно быть доступно внешнему классу.

Теперь, когда мы создали розетку и действие, нам нужно только соединить их с соответствующими элементами. Откройте раскадровку и соедините розетку fruitsLabel с ярлыком и showFruits: action. Выберите Touch Up Inside в качестве управляющего события для кнопки.


Откройте ViewController.m и создайте следующий метод инициализатора:

1
2
3
4
5
6
7
-(id) initWithCoder:(NSCoder *)aDecoder{
    if (self = [super initWithCoder:aDecoder]) {
        self.fruits = [[NSMutableArray alloc] initWithObjects:@»Apple», @»Orange», @»Banana», @»Strawberry», @»Peach»,nil];
    }
     
    return self;
}

Здесь мы создаем наш массив фруктов и храним в нем несколько фруктов.


Добавьте следующий код ниже метода didReceiveMemoryWarning :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
— (IBAction)showFruits:(id)sender
{
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@»Select a fruit»
                                                             delegate:self
                                                    cancelButtonTitle:nil
                                               destructiveButtonTitle:nil
                                                    otherButtonTitles:nil];
     
    for (NSString *fruit in self.fruits) {
        [actionSheet addButtonWithTitle:fruit];
    }
     
    actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@»Cancel»];
     
    [actionSheet showInView:self.view];
}

Сначала мы создаем лист действий, как вы обычно делаете. Мы даем ему название и делегата, но мы не добавляем никаких кнопок, даже кнопки отмены. Если бы мы добавили сюда кнопку отмены, а все остальные кнопки позже, кнопка отмены была бы вверху списка, а не внизу.

Далее мы используем цикл быстрого перечисления, чтобы просмотреть все фрукты, хранящиеся в массиве фруктов, созданном ранее. В этом цикле мы добавляем кнопки для всех фруктов на лист действий. После цикла for мы добавляем кнопку отмены на лист действий. Как видите, мы делаем это, добавляя кнопку с заголовком «Отмена» в cancelButtonIndex . Таким образом, лист действий знает, что кнопка «Отмена» должна быть внизу списка. Наконец, мы показываем лист действий нормальным способом.


Добавьте следующий метод протокола делегата листа действия ниже showFruits: action:

1
2
3
4
5
6
— (void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex != actionSheet.cancelButtonIndex) {
        self.fruitLabel.text = [self.fruits objectAtIndex:buttonIndex];
    }
}

Этот метод делегата вызывается при нажатии кнопки на листе действий. Сначала мы проверяем, нажата ли кнопка для фруктов или кнопка отмены. Мы делаем это, сравнивая выбранный индекс кнопки с индексом кнопки отмены. Если выбранная кнопка предназначена для фруктов, мы обновляем этикетку с выбранными фруктами.


Спасибо, что прочитали этот быстрый совет о создании листа действий с элементами из массива. Я надеюсь, что вы сочли полезным! Если у вас есть вопросы или комментарии к этому совету, оставьте их в разделе комментариев ниже.