Используйте NSArray, чтобы указать другие названия кнопок?


конструктор 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 54

6 ответов:

это год, но решение довольно простое ... сделайте, как предложил @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 (обычно это будет ). Кроме того, если вы удерживаете кнопку "Отмена", чтобы быть последней кнопки, iOS будет добавить, что приятно, расстояние меж других кнопок и кнопки "Отмена".

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

вместо добавления кнопок при инициализации 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]; 

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

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];
- (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];
}

вы можете добавить кнопку отмены и установить ее следующим образом:

[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle: @"Cancel"]];

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

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

получается последние запись addButtonWithTitle: должен быть . Я бы использовал:

// 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;