Использовать NSArray для указания другихButtonTitles? - PullRequest
54 голосов
/ 21 октября 2009

Конструктор UIAlertSheet принимает параметр otherButtonTitles в качестве списка varg. Вместо этого я хотел бы указать другие заголовки кнопок из NSArray. Возможно ли это?

т.е. Я должен сделать это:

id alert = [[UIActionSheet alloc] initWithTitle: titleString
                                  delegate: self
                                  cancelButtonTitle: cancelString
                                  destructiveButtonTitle: nil
                                  otherButtonTitles: button1Title, button2Title, nil];

Но так как я генерирую список доступных кнопок во время выполнения, я действительно хочу что-то вроде этого:

id alert = [[UIActionSheet alloc] initWithTitle: titleString
                                       delegate: self
                              cancelButtonTitle: cancelString
                         destructiveButtonTitle: nil
                              otherButtonTitles: otherButtonTitles];

Прямо сейчас, я думаю, что мне нужно сделать отдельный звонок на initWithTitle: для 1 предмета, 2 предметов и 3 предметов. Как это:

if ( [titles count] == 1 ) {
     alert = [[UIActionSheet alloc] initWithTitle: titleString
                                         delegate: self
                                cancelButtonTitle: cancelString
                           destructiveButtonTitle: nil
                                otherButtonTitles: [titles objectAtIndex: 0], nil];
} else if ( [titles count] == 2) {
     alert = [[UIActionSheet alloc] initWithTitle: titleString
                                         delegate: self
                                cancelButtonTitle: cancelString
                           destructiveButtonTitle: nil
                                otherButtonTitles: [titles objectAtIndex: 0], [titles objectAtIndex: 1],  nil];
} else {
    // and so on
}

Это много повторяющегося кода, но на самом деле это может быть разумно, так как у меня максимум три кнопки. Как я могу избежать этого?

Ответы [ 6 ]

72 голосов
/ 29 ноября 2012

Это год, но решение довольно простое ... сделать, как предложил @Simon, но не указывайте заголовок кнопки отмены, поэтому:

UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString
                              delegate: self
                              cancelButtonTitle: nil
                              destructiveButtonTitle: nil
                              otherButtonTitles: nil];

Но после добавления обычных кнопок добавьте кнопку отмены, например:

for( NSString *title in titles)  {
    [alert addButtonWithTitle:title]; 
}

[alert addButtonWithTitle:cancelString];

Теперь ключевой шаг - указать, какая кнопка является кнопкой отмены, например:

alert.cancelButtonIndex = [titles count];

Мы делаем [titles count], а не [titles count] - 1, потому что мы добавляем кнопку отмены как дополнительную из списка кнопок в titles.

Теперь вы также указываете, какую кнопку вы хотите использовать как деструктивную кнопку (т.е. красную кнопку), указав destructiveButtonIndex (обычно это кнопка [titles count] - 1). Кроме того, если вы удерживаете кнопку отмены последней кнопкой, iOS добавит этот хороший интервал между другими кнопками и кнопкой отмены.

Все это совместимо с iOS 2.0, так что наслаждайтесь.

52 голосов
/ 21 октября 2009

Вместо добавления кнопок при инициализации UIActionSheet, попробуйте добавить их с помощью метода addButtonWithTitle, используя цикл for, который проходит через NSArray.

UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString
                              delegate: self
                              cancelButtonTitle: cancelString
                              destructiveButtonTitle: nil
                              otherButtonTitles: nil];

for( NSString *title in titles)  
    [alert addButtonWithTitle:title]; 
6 голосов
/ 24 августа 2013

addButtonWithTitle: возвращает индекс добавленной кнопки. Задайте для cancelButtonTitle значение nil в методе init и после добавления дополнительных кнопок выполните следующее:

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];
4 голосов
/ 25 декабря 2012
- (void)showActionSheetWithButtons:(NSArray *)buttons withTitle:(NSString *)title {

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle: title 
                                                             delegate: self
                                                    cancelButtonTitle: nil 
                                               destructiveButtonTitle: nil 
                                                    otherButtonTitles: nil];

    for (NSString *title in buttons) {
        [actionSheet addButtonWithTitle: title];
    }

    [actionSheet addButtonWithTitle: @"Cancel"];
    [actionSheet setCancelButtonIndex: [buttons count]];
    [actionSheet showInView:self.view];
}
2 голосов
/ 18 февраля 2014

Вы можете добавить кнопку отмены и установить ее так:

[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle: @"Cancel"]];
1 голос
/ 17 июня 2014

Я знаю, что это старый пост, но в случае, если кто-то еще, как я, пытается выяснить это.

(На этот ответ ответил @kokemomuke. Это в основном более подробное объяснение. Также на основе @Ephraim и @Simon)

Оказывается, запись LAST в addButtonWithTitle: должна быть кнопкой Cancel. Я бы использовал:

// All titles EXCLUDING Cancel button
for( NSString *title in titles)  
    [sheet addButtonWithTitle:title];


// The next two line MUST be set correctly: 
// 1. Cancel button must be added as the last entry
// 2. Index of the Cancel button must be set to the last entry

[sheet addButtonWithTitle:@"Cancel"];

sheet.cancelButtonIndex = titles.count - 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...