2009-10-21 22 views
54

Konstruktor UIAlertSheet przyjmuje parametr otherButtonTitles jako listę varg. Chciałbym podać inne tytuły przycisków z NSArray. czy to możliwe?Użyj NSArray, aby określić inneButtonTitles?

czyli muszę to zrobić:

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

Ale ponieważ jestem generowania listy dostępnych przycisków w czasie wykonywania, naprawdę chcę coś takiego:

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

Teraz ja "Myślę, że muszę mieć osobne połączenie z initWithTitle: dla 1 przedmiotu, 2 przedmiotów i 3 przedmiotów. Tak:

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 
} 

To dużo duplikatu kodu, ale może to być rzeczywiście uzasadnione, ponieważ mam co najwyżej trzech przycisków. Jak mogę tego uniknąć?

Odpowiedz

72

Jest to letnia ale rozwiązanie jest dość proste ... zrobić jak sugeruje @Simon ale nie określają anulować tytuł przycisk, więc:

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

Ale po dodaniu swoje normalne przyciski dodać przycisk anuluj, jak:

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

[alert addButtonWithTitle:cancelString]; 

teraz kluczowym krokiem jest określenie, który przycisk jest przycisk anuluj, jak:

alert.cancelButtonIndex = [titles count]; 

Wykonujemy [titles count], a nie [titles count] - 1, ponieważ dodajemy przycisk anulowania jako dodatkowy z listy przycisków w titles.

Teraz należy również określić przycisk, który ma być destrukcyjny (tj. Czerwony przycisk), określając destructiveButtonIndex (zazwyczaj będzie to przycisk [titles count] - 1). Ponadto, jeśli przycisk anulowania jest ostatnim przyciskiem, iOS doda te ładne odstępy między innymi przyciskami i przyciskiem anulowania.

Wszystkie te elementy są zgodne z systemem iOS 2.0, więc ciesz się nimi.

+0

Nie wiem, dlaczego to zadziałało, ale musiałem zrobić "[tytuły się liczą] - 1", żeby zadziałał dla mnie, iOS 7. – Micah

+1

[numer alarmu] Przyciski -1 to inny sposób ustawiania indeksu przycisku anulowania – Keith

+2

Drobny uwaga: używając nazw ustalonych tutaj, myślę, że 'sheet.cancelButtonIndex' powinno być' alert.cancelButtonIndex', yes? – Matt

52

Zamiast dodawać przyciski podczas inicjowania arkusza UIActionSheet, spróbuj dodać je za pomocą metody addButtonWithTitle, używając pętli for przechodzącej przez NSArray.

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

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

łatwiejsze niż to: 'for (NSString * title w tytułach) {[alert addButtonWithTitle: title]; } 'Nie ma potrzeby tworzenia modułu wyliczającego. –

+3

Powoduje to pojawienie się przycisków PO przycisku Anuluj. Jakikolwiek sposób naprawić ten @bent lub @imon? (patrz edycja na http://stackoverflow.com/questions/7781022) –

+1

Spróbuj użyć właściwości 'cancelButtonIndex'. – 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: zwraca indeks dodanego przycisku. Ustaw cancelButtonTitle do zera w metodzie init, a po dodaniu dodatkowych przycisków uruchomić to:

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

Można dodać przycisk Anuluj i ustawić go tak:

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

Wiem, że to stary post, ale na wypadek, gdyby ktoś inny, jak ja, próbował to rozgryźć.

(Ta odpowiedź została wysłana przez @kokemomuke, jest to bardziej szczegółowe wyjaśnienie.budowanie również na @Ephraim i @Simon)

Okazuje się, że LAST wpisu addButtonWithTitle: musi być przycisk Cancel. Użyłbym:

// 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; 
Powiązane problemy