Створіть UIActionSheet 'otherButtons', передавши масив, а не список


110

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

Тож як я можу передати ці заголовки до UIActionSheet? Я вирішив, що я пропонував вирішити, щоб перейти нуль в otherButtonTitles :, а потім вказати заголовки кнопок окремо за допомогою addButtonWithTitle :. Але в цьому виникає проблема переміщення кнопки «Скасувати» на перше місце на аркуші UIAction, а не на останнє; Я хочу, щоб це було останнє.

Чи є спосіб 1) передати масив замість змінного списку рядків, або, як альтернатива, 2) перемістити кнопку скасування до нижньої частини UIActionSheet?

Дякую.


не впевнений, що це буде працювати, але властивість cancelButtonIndex UIActionSheet не є лише для читання. Спробуйте встановити його і побачити, чи змінює це порядок кнопок?
lostInTransit

Відповіді:


248

У мене це працює (вам просто потрібно, будьте в порядку з звичайною кнопкою, і просто додайте її після:

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

19
Це працює; Дякую. Не усвідомлював, що властивість cancelButtonIndex може бути встановлена. Я думаю, що ми можемо погодитись: API Apple для цього відстійний.
Грег Малетик

11
Я другий! І 99,99% їх документації також висмоктує. Це як спробувати вивчити операцію на мозку з книги, написаної архаїчною івритом, не знаючи цієї мови.
Качка

4
Я дуже хочу, щоб я міг проголосувати за це ще багато разів. Тріск відповідь, і я не можу повірити, що я пройшов так довго, не знаючи про це!
mattjgalloway

1
@JimThio cancelButtonне червоний. destructiveButtonЧервоний.
Армін

1
На жаль, це рішення страждає від помилки в UIActionSheet, яка [UIActionSheet addButtonWithTitle], здається, не правильно встановлена firstOtherButtonIndex(яка повинна використовуватися в делегатах, actionSheet:clickedButtonAtIndex:а не в жорсткому кодуванні 0 або подібних матеріалів). Брудність з перетворенням NSArrayна теж va_listне чудово підходить для вирішення. :-( Цей API такий проклятий некрасивий.
Даніель Рінсер

78

Одне невелике зауваження: [actionSheet addButtonWithTitle:] повертає індекс цієї кнопки, щоб бути безпечним і "чистим", ви можете зробити це:

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

Чи стане це кнопкою скасування червоною?
user4951

1
@JimThio Ні, червона кнопка називається «destructiveButton», і є відповідне властивість destructiveButtonIndexдля нього
Нік

3

Отримавши відповіді Джаби та Ніка і продовживши їх трохи далі. Щоб включити кнопку знищення в це рішення:

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

Існує швидка версія для відповіді:

//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]
}

Для користувачів в майбутньому ... Він працював ... але це засуджується ... використання stackoverflow.com/a/41322537/884674
jeet.chanchawat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.