Создайте UIActionSheet 'otherButtons', передавая массив, а не varlist - PullRequest
110 голосов
/ 05 марта 2010

У меня есть массив строк, которые я хочу использовать для заголовков кнопок на UIActionSheet. К сожалению, аргумент otherButtonTitles: в вызове метода принимает список строк переменной длины, а не массив.

Итак, как мне передать эти заголовки в UIActionSheet? Предложенный мною обходной путь - передать nil в otherButtonTitles:, а затем указать заголовки кнопок индивидуально, используя addButtonWithTitle: Но при этом возникает проблема перемещения кнопки «Отмена» в первую позицию на UIActionSheet, а не в последнюю; Я хочу, чтобы это было последним.

Есть ли способ 1) передать массив вместо списка переменных строк или, альтернативно, 2) переместить кнопку отмены вниз UIActionSheet?

Спасибо.

Ответы [ 4 ]

246 голосов
/ 05 марта 2010

Я получил это на работу (вам просто нужно, будьте в порядке с обычной кнопкой, и просто добавьте его после:

NSArray *array = @[@"1st Button",@"2nd Button",@"3rd Button",@"4th Button"];

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Title Here"
                                                             delegate:self
                                                    cancelButtonTitle:nil
                                               destructiveButtonTitle:nil
                                                    otherButtonTitles:nil];

    // ObjC Fast Enumeration
    for (NSString *title in array) {
        [actionSheet addButtonWithTitle:title];
    }

    actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];

    [actionSheet showInView:self.view];
78 голосов
/ 24 июня 2010

Одна небольшая заметка: [actionSheet addButtonWithTitle:] возвращает индекс этой кнопки, поэтому, чтобы быть безопасным и «чистым», вы можете сделать это:

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];
3 голосов
/ 04 мая 2014

Принимая ответы Джабы и Ника и расширяя их немного дальше. Чтобы включить кнопку уничтожения в это решение:

// Create action sheet
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:title
                                                         delegate:self
                                                cancelButtonTitle:nil
                                           destructiveButtonTitle:nil
                                                otherButtonTitles:nil];
// Action Buttons
for (NSString *actionName in actionNames){
    [actionSheet addButtonWithTitle: actionName];
}

// Destruction Button
if (destructiveName.length > 0){
    [actionSheet setDestructiveButtonIndex:[actionSheet addButtonWithTitle: destructiveName]];
}

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

// Present Action Sheet
[actionSheet showInView: self.view];
1 голос
/ 11 мая 2016

Существует быстрая версия для ответа:

//array with button titles
private var values = ["Value 1", "Value 2", "Value 3"]

//create action sheet
let actionSheet = UIActionSheet(title: nil, delegate: self, cancelButtonTitle: nil, destructiveButtonTitle: nil)
//for each value in array
for value in values{
    //add a button
    actionSheet.addButtonWithTitle(value as String)
}
//display action sheet
actionSheet.showInView(self.view)

Чтобы получить выбранное значение, добавьте делегата к вашему ViewController:

class MyViewController: UIViewController, UIActionSheetDelegate

И реализовать метод «clickedButtonAtIndex»

func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
    let selectedValue : String = values[buttonIndex]
}
...