Varlist'i değil, diziyi ileterek UIActionSheet 'otherButtons' oluşturun


110

Bir UIActionSheet üzerindeki düğme başlıkları için kullanmak istediğim bir dizi dizim var. Ne yazık ki, yöntem çağrısındaki otherButtonTitles: bağımsız değişkeni, bir dizi değil, değişken uzunluklu dizeler listesi alır.

Peki bu başlıkları UIActionSheet'e nasıl aktarabilirim? Önerdiğim geçici çözüm, otherButtonTitles: 'a nil geçirmek ve ardından addButtonWithTitle: kullanarak düğme başlıklarını tek tek belirtmektir. Ancak bu, "İptal" düğmesini son yerine UIActionSheet üzerindeki ilk konuma taşıma sorununa sahiptir; Sonuncusu olmasını istiyorum.

1) değişken dizeler listesi yerine bir dizi geçirmenin veya alternatif olarak 2) iptal düğmesini UIActionSheet'in altına taşımanın bir yolu var mı?

Teşekkürler.


bunun işe yarayıp yaramayacağından emin değilim, ancak UIActionSheet'in cancelButtonIndex özelliği salt okunur değil. Ayarlamayı deneyin ve bunun düğmelerin sırasını değiştirip değiştirmediğine bakın.
lostInTransit

Yanıtlar:


248

Bunun işe yaramasını sağladım (yapmanız gereken, normal bir düğmeyle sorun yaşamamak ve sonra eklemek yeterlidir:

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];

19
Bu çalışıyor; Teşekkürler. CancelButtonIndex özelliğinin ayarlanabileceğinin farkında değildim. Hepimizin üzerinde anlaşabileceğimizi düşündüğüm bir şey var: Apple'ın bunun için API'si berbat.
Greg Maletic

11
Ben buna katılıyorum! Ve belgelerinin% 99,99'u da berbat. Arkaik İbranice yazılmış bir kitaptan o dili bilmeden beyin cerrahisini öğrenmeye çalışmak gibidir.
Duck

4
Keşke bu kadar çok oy alabilseydim. Çatlayan cevap ve bunu bilmeden bu kadar uzun süredir gittiğime inanamıyorum!
mattjgalloway

1
@JimThio cancelButtonkırmızı değil. destructiveButtonKırmızıdır.
Armin

1
Ne yazık ki, bu çözüm, UIActionSheet'te [UIActionSheet addButtonWithTitle]doğru şekilde ayarlanmayan bir hatadan muzdariptir firstOtherButtonIndex(bu, actionSheet:clickedButtonAtIndex:0 veya benzeri şeyleri kodlamak yerine temsilcinin kodunda kullanılması gerekir ). Bir 'i' NSArraye dönüştürürken çirkinleşmek de va_listharika bir çözüm gibi görünmüyor. :-( Bu API çok çirkin.
Daniel Rinser

78

Küçük bir not: [actionSheet addButtonWithTitle:], bu düğmenin dizinini döndürür, bu nedenle güvenli ve "temiz" olmak için şunu yapabilirsiniz:

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

Bu, iptal düğmesini kırmızıya mı çevirecek?
user4951

1
@JimThio Hayır, kırmızı düğmeye "destroytiveButton" denir ve bunun için ilgili bir özellik destructiveButtonIndexvar
Nick

3

Jaba'nın ve Nick'in yanıtlarını alıp biraz daha genişletiyor. Bu çözüme bir imha düğmesi eklemek için:

// 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];

1

Yanıtın hızlı versiyonu var:

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

Değerin seçilmesini sağlamak için ViewController'ınıza temsilci ekleyin:

class MyViewController: UIViewController, UIActionSheetDelegate

Ve "clickedButtonAtIndex" yöntemini uygulayın

func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
    let selectedValue : String = values[buttonIndex]
}

Gelecekteki kullanıcılar için ... İşe yaradı ... ancak kullanımdan kaldırıldı ... stackoverflow.com/a/41322537/884674
adresini
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.