2009-10-21 8 views
54

Der Konstruktor von UIAlertSheet verwendet einen anderenButtonTitles-Parameter als eine Varg-Liste. Ich möchte stattdessen die anderen Schaltflächentitel von einem NSArray angeben. Ist das möglich?Verwenden Sie NSArray, um otherButtonTitles anzugeben?

dh ich, dies zu tun haben:

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 so etwas wie dieses:

id alert = [[UIActionSheet alloc] initWithTitle: titleString 
             delegate: self 
           cancelButtonTitle: cancelString 
         destructiveButtonTitle: nil 
           otherButtonTitles: otherButtonTitles]; 

jetzt Richtig, ich Ich denke, dass ich einen separaten Anruf an initWithTitle: für 1 Artikel, 2 Artikel und 3 Artikel haben muss. Wie folgt:

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 Doppel-Code, aber es könnte tatsächlich sinnvoll sein, da ich höchstens drei Tasten habe. Wie kann ich das vermeiden?

Antwort

72

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 , die Taste abbrechen verwenden, wie:

for(NSString *title in titles) { 
    [alert addButtonWithTitle:title]; 
} 

[alert addButtonWithTitle:cancelString]; 

nun 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 Abbrechen-Schaltfläche als Extra aus der Liste der Schaltflächen in titles hinzufügen.

Sie geben jetzt auch an, welche Schaltfläche die destruktive Schaltfläche sein soll (dh die rote Schaltfläche), indem Sie den destructiveButtonIndex angeben (normalerweise ist dies die Schaltfläche [titles count] - 1). Wenn Sie die Abbrechen-Schaltfläche als letzte Schaltfläche beibehalten, fügt iOS diesen Abstand zwischen den anderen Schaltflächen und der Abbrechen-Schaltfläche hinzu.

Alle diese sind iOS 2.0 kompatibel, also genießen Sie.

+0

Nicht sicher, warum es für Sie funktioniert hat, aber ich musste "[titles count] - 1" für iOS 7 verwenden. – Micah

+1

[alert numberOfButtons] -1 ist eine weitere Möglichkeit, den Index der Abbruchschaltfläche zu setzen – Keith

+2

Minor Hinweis: Mit den Namen, die Sie hier festgelegt haben, sollte 'sheet.cancelButtonIndex'" alert.cancelButtonIndex "sein, ja? – Matt

52

Anstatt die Schaltflächen hinzuzufügen, wenn Sie das UIActionSheet initialisieren, versuchen Sie, sie mit der addButtonWithTitle-Methode mithilfe einer for-Schleife hinzuzufügen, die durch Ihr NSArray geht.

UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString 
           delegate: self 
           cancelButtonTitle: cancelString 
           destructiveButtonTitle: nil 
           otherButtonTitles: nil]; 

for(NSString *title in titles) 
    [alert addButtonWithTitle:title]; 
+12

einfacher als das: 'für (NSString * Titel in Titeln) {[alert addButtonWithTitle: Titel]; } 'Es muss kein Enumerator erstellt werden. –

+3

Dadurch erscheinen die Schaltflächen NACH der Abbrechen-Schaltfläche. Irgendeine Möglichkeit, @bent oder @simon zu reparieren? (Siehe Bearbeiten auf http://stackoverflow.com/questions/7781022) –

+1

Versuchen Sie, die 'cancelButtonIndex' -Eigenschaft zu verwenden. – Simon

4
- (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]; 
} 
6

addButtonWithTitle: Gibt den Index der hinzugefügten Schaltfläche zurück. Stellen Sie cancelButtonTitle auf null in der init-Methode und nach der Zugabe von zusätzlichen Tasten laufen diese:

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

Sie die Taste abbrechen hinzufügen und legen Sie es wie folgt aus:

[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle: @"Cancel"]]; 
1

Ich weiß, das ist eine alte Post, aber falls jemand anders, wie ich, versucht, das herauszufinden.

(Dies wurde von @kokemomuke beantwortet. Dies ist meist eine detailliertere Erklärung.Auch baut 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; 
Verwandte Themen