Erstellen Sie das UIActionSheet 'otherButtons', indem Sie ein Array und keine Varlist übergeben

110

Ich habe eine Reihe von Zeichenfolgen, die ich für Schaltflächentitel in einem UIActionSheet verwenden möchte. Leider verwendet das Argument otherButtonTitles: im Methodenaufruf eine Liste von Zeichenfolgen mit variabler Länge, kein Array.

Wie kann ich diese Titel an das UIActionSheet übergeben? Die Problemumgehung, die ich vorgeschlagen habe, besteht darin, nil an otherButtonTitles: zu übergeben und dann die Schaltflächentitel mithilfe von addButtonWithTitle: einzeln anzugeben. Dies hat jedoch das Problem, dass die Schaltfläche "Abbrechen" an die erste Position im UIActionSheet und nicht an die letzte Position verschoben wird. Ich möchte, dass es der letzte ist.

Gibt es eine Möglichkeit, 1) ein Array anstelle einer variablen Liste von Zeichenfolgen zu übergeben oder alternativ 2) die Schaltfläche Abbrechen an den unteren Rand des UIActionSheets zu verschieben?

Vielen Dank.

Greg Maletic
quelle
Ich bin nicht sicher, ob dies funktioniert, aber die Eigenschaft cancelButtonIndex von UIActionSheet ist nicht schreibgeschützt. Versuchen Sie es einzustellen und prüfen Sie, ob sich dadurch die Reihenfolge der Schaltflächen ändert.
lostInTransit

Antworten:

248

Ich habe das zum Laufen gebracht (Sie müssen nur mit einem normalen Knopf in Ordnung sein und es einfach nachher hinzufügen:

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];
Jab
quelle
19
Das funktioniert; Vielen Dank. Wusste nicht, dass die Eigenschaft cancelButtonIndex festgelegt werden konnte. Eines können wir uns wohl alle einig sein: Apples API dafür ist scheiße.
Greg Maletic
11
Ich unterstütze das! Und 99,99% ihrer Dokumentation sind auch scheiße. Es ist, als würde man versuchen, Gehirnchirurgie aus einem Buch zu lernen, das in archaischem Hebräisch geschrieben ist, ohne diese Sprache zu kennen.
Ente
4
Ich wünschte sehr, ich könnte noch viele Male abstimmen. Cracking Antwort und ich kann nicht glauben, dass ich so lange gegangen bin, ohne davon zu wissen!
Mattjgalloway
1
@ JimThio cancelButtonist nicht rot. Das destructiveButtonist rot.
Armin
1
Leider leidet diese Lösung an einem Fehler in UIActionSheet, [UIActionSheet addButtonWithTitle]der nicht richtig eingestellt zu sein scheint firstOtherButtonIndex(der in den Delegaten verwendet werden sollte, actionSheet:clickedButtonAtIndex:anstatt 0 oder ähnliches hart zu codieren). Es klingt auch nicht nach einer großartigen Lösung, mit dem Konvertieren von NSArrayin böse zu va_listwerden. :-( Diese API ist so verdammt hässlich.
Daniel Rinser
78

Ein kleiner Hinweis: [actionSheet addButtonWithTitle:] gibt den Index dieser Schaltfläche zurück. Um sicher und "sauber" zu sein, können Sie dies tun:

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];
Nick
quelle
Wird dadurch die Abbrechen-Taste rot?
user4951
1
@ JimThio Nein, der rote Knopf heißt "destructiveButton" und es gibt eine entsprechende Eigenschaft destructiveButtonIndexdafür
Nick
3

Nehmen Sie die Antworten von Jaba und Nick und erweitern Sie sie ein wenig weiter. So integrieren Sie einen Zerstörungsknopf in diese Lösung:

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

Es gibt die schnelle Version für die Antwort:

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

Fügen Sie Ihrem ViewController einen Delegaten hinzu, um den Wert auszuwählen:

class MyViewController: UIViewController, UIActionSheetDelegate

Und implementieren Sie die Methode "clickedButtonAtIndex"

func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
    let selectedValue : String = values[buttonIndex]
}
Kevin ABRIOUX
quelle
Für zukünftige Benutzer ... Es hat funktioniert ... aber es ist veraltet ... Verwenden Sie stackoverflow.com/a/41322537/884674
jeet.chanchawat