Utwórz arkusz UIActionSheet „otherButtons”, przekazując tablicę, a nie varlist

110

Mam tablicę ciągów, których chcę użyć dla tytułów przycisków w arkuszu UIActionSheet. Niestety argument otherButtonTitles: w wywołaniu metody przyjmuje listę łańcuchów o zmiennej długości, a nie tablicę.

Jak więc mogę przekazać te tytuły do ​​arkusza UIActionSheet? Obejście, które widziałem, sugerowane, polega na przekazaniu nil do otherButtonTitles:, a następnie określaniu tytułów przycisków indywidualnie za pomocą addButtonWithTitle :. Ale powoduje to problem z przeniesieniem przycisku „Anuluj” na pierwszą pozycję w arkuszu UIActionSheet, a nie na ostatnią; Chcę, żeby był ostatni.

Czy istnieje sposób na 1) przekazanie tablicy zamiast zmiennej listy ciągów lub alternatywnie 2) przeniesienie przycisku anulowania na dół arkusza UIActionSheet?

Dzięki.

Greg Maletic
źródło
Nie jestem pewien, czy to zadziała, ale właściwość cancelButtonIndex UIActionSheet nie jest tylko do odczytu. Spróbuj to ustawić i zobacz, czy zmieni to kolejność przycisków?
lostInTransit

Odpowiedzi:

248

Mam to do pracy (wystarczy, wystarczy zwykły przycisk i po prostu dodaj go po:

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];
Ukłucie
źródło
19
To działa; dzięki. Nie zdawałem sobie sprawy, że można ustawić właściwość cancelButtonIndex. Myślę, że wszyscy możemy się zgodzić: API Apple'a jest do bani.
Greg Maletic
11
Popieram to! A 99,99% ich dokumentacji również jest do bani. To tak, jakby próbować nauczyć się operacji mózgu z książki napisanej archaicznym hebrajskim bez znajomości tego języka.
Duck
4
Bardzo chciałbym móc głosować jeszcze wiele razy. Pękająca odpowiedź i nie mogę uwierzyć, że tak długo nie wiedziałem o tym!
mattjgalloway
1
@JimThio cancelButtonnie jest czerwony. destructiveButtonJest czerwony.
Armin
1
Niestety, w tym rozwiązaniu występuje błąd w UIActionSheet, [UIActionSheet addButtonWithTitle]który nie wydaje się być poprawnie ustawiony firstOtherButtonIndex(co powinno być używane w delegacie, actionSheet:clickedButtonAtIndex:a nie na twardym kodowaniu 0 lub podobnych rzeczy). Brzydota z konwersją an NSArrayna va_listrównież nie brzmi jak świetne rozwiązanie. :-( To API jest tak cholernie brzydkie.
Daniel Rinser
78

Jedna mała uwaga: [actionSheet addButtonWithTitle:] zwraca indeks tego przycisku, więc aby być bezpiecznym i „czystym”, możesz to zrobić:

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];
Nacięcie
źródło
Czy to zmieni kolor przycisku anulowania na czerwony?
user4951
1
@JimThio Nie, czerwony przycisk nazywa się „destructiveButton”, a tam jest odpowiednia właściwość destructiveButtonIndexdla niego
Nick
3

Biorąc odpowiedzi Jaby i Nicka i rozszerzając je trochę dalej. Aby włączyć przycisk zniszczenia do tego rozwiązania:

// 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];
Stephen Donnell
źródło
1

Istnieje szybka wersja odpowiedzi:

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

Aby uzyskać wybraną wartość, dodaj delegata do kontrolera ViewController:

class MyViewController: UIViewController, UIActionSheetDelegate

Zaimplementuj metodę „clickedButtonAtIndex”

func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
    let selectedValue : String = values[buttonIndex]
}
Kevin ABRIOUX
źródło
Dla przyszłych użytkowników ...
Zadziałało