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?

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top