Verwenden Sie NSArray otherButtonTitles angeben?
-
05-07-2019 - |
Frage
UIAlertSheet Konstruktor nimmt einen otherButtonTitles Parameter als varg Liste. Ich möchte stattdessen die andere Schaltfläche Titel von einem NSArray angeben. Ist das möglich?
d. Ich habe dies zu tun:
id alert = [[UIActionSheet alloc] initWithTitle: titleString
delegate: self
cancelButtonTitle: cancelString
destructiveButtonTitle: nil
otherButtonTitles: button1Title, button2Title, nil];
Aber da ich die Liste der verfügbaren Tasten zur Laufzeit zu erzeugen, ich möchte wirklich etwas wie folgt aus:
id alert = [[UIActionSheet alloc] initWithTitle: titleString
delegate: self
cancelButtonTitle: cancelString
destructiveButtonTitle: nil
otherButtonTitles: otherButtonTitles];
Im Moment denke ich, dass ich einen separaten Anruf haben, für 1 Punkt, 2 Artikel und 3 Artikel initWithTitle:
. Wie folgt aus:
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
}
Das ist eine Menge von doppeltem Code, aber es könnte in der Tat sinnvoll sein, da ich höchstens drei Tasten habe. Wie kann ich vermeiden das?
Lösung
Dies ist ein Jahr alt, aber die Lösung ist recht einfach ... tun, wie @ Simon vorgeschlagen, aber nicht angeben, einen Knopf Titel aufheben, so:
UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString
delegate: self
cancelButtonTitle: nil
destructiveButtonTitle: nil
otherButtonTitles: nil];
Aber nach dem normalen Tasten Hinzufügen, fügen Sie die Taste Abbrechen, wie:
for( NSString *title in titles) {
[alert addButtonWithTitle:title];
}
[alert addButtonWithTitle:cancelString];
Jetzt ist der entscheidende Schritt ist zu bestimmen, welche Taste die Taste abbrechen wird, wie:
alert.cancelButtonIndex = [titles count];
Wir tun [titles count]
und nicht [titles count] - 1
, weil wir die Taste als zusätzliche aus der Liste der Schaltflächen in titles
Abbrechen hinzufügen.
Sie jetzt auch angeben, welche Tasten Sie die zerstörerische Taste (dh die rote Taste), indem die destructiveButtonIndex Angabe (in der Regel das wird die [titles count] - 1
Taste) sein wollen. Auch, wenn Sie die Löschtaste halten den letzten Knopf zu sein, wird iOS fügen Sie diesen schönen Abstand zwischen den anderen Tasten und die Löschtaste.
Alle diese sind iOS 2.0 kompatibel, so genießen.
Andere Tipps
Statt die Tasten des Hinzufügens, wenn Sie die UIActionSheet initialisieren, versuchen, sie mit dem addButtonWithTitle Verfahren Zugabe mit einer for-Schleife, die durch Ihre NSArray geht.
UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString
delegate: self
cancelButtonTitle: cancelString
destructiveButtonTitle: nil
otherButtonTitles: nil];
for( NSString *title in titles)
[alert addButtonWithTitle:title];
addButtonWithTitle: gibt den Index des hinzugefügten Button. Stellen Sie cancelButtonTitle auf null in der init-Methode und nach der Zugabe von zusätzlichen Tasten laufen folgendermaßen aus:
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];
}
Sie können die Schaltfläche Abbrechen und legen Sie es wie folgt aus:
[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle: @"Cancel"]];
Ich weiß, das ist eine alte Post, aber falls jemand anderes, wie ich, versucht, dies herauszufinden.
(Dies wurde von @kokemomuke beantwortet. Dies ist vor allem eine ausführlichere Erklärung. Auch dabei auf @Ephraim und @ Simon)
Es stellt sich heraus, die LAST Eintrag von addButtonWithTitle: muss die Cancel
Taste sein. Ich würde verwenden:
// 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;