Buat UIActionSheet 'otherButtons' dengan meneruskan array, bukan varlist

110

Saya memiliki array string yang ingin saya gunakan untuk judul tombol di UIActionSheet. Sayangnya, argumen otherButtonTitles: dalam pemanggilan metode menggunakan daftar panjang variabel dari string, bukan array.

Jadi bagaimana saya bisa memasukkan judul-judul ini ke dalam UIActionSheet? Solusi yang saya lihat disarankan adalah dengan mengirimkan nil ke otherButtonTitles :, lalu tentukan judul tombol satu per satu dengan menggunakan addButtonWithTitle :. Tetapi ini memiliki masalah memindahkan tombol "Batal" ke posisi pertama di UIActionSheet daripada yang terakhir; Saya ingin menjadi yang terakhir.

Apakah ada cara untuk 1) meneruskan array sebagai pengganti daftar variabel string, atau sebagai alternatif 2) memindahkan tombol batal ke bagian bawah UIActionSheet?

Terima kasih.

Greg Maletic
sumber
tidak yakin apakah ini akan berhasil tetapi properti cancelButtonIndex dari UIActionSheet tidak hanya-baca. Coba atur dan lihat apakah itu mengubah urutan tombol?
lostInTransit

Jawaban:

248

Saya membuat ini berfungsi (Anda hanya perlu, ok dengan tombol biasa, dan tambahkan saja setelah:

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];
Tusukan
sumber
19
Ini bekerja; Terima kasih. Tidak menyadari bahwa properti cancelButtonIndex dapat disetel. Satu hal yang saya pikir kita semua bisa sepakati: API Apple untuk ini menyebalkan.
Greg Maletic
11
Saya mendukung ini! Dan 99,99% dari dokumentasi mereka juga menyebalkan. Ini seperti mencoba mempelajari bedah otak dari sebuah buku yang ditulis dalam bahasa Ibrani kuno tanpa mengetahui bahasa itu.
Bebek
4
Saya sangat berharap saya dapat memberikan suara ini lebih banyak lagi. Jawaban retak dan saya tidak percaya saya sudah lama tidak mengetahui tentang ini!
mattjgalloway
1
@JimThio cancelButtonbukan merah. Itu destructiveButtonmerah.
Armin
1
Sayangnya, solusi ini mengalami bug di UIActionSheet yang [UIActionSheet addButtonWithTitle]tampaknya tidak disetel dengan benar firstOtherButtonIndex(yang seharusnya digunakan dalam delegasi actionSheet:clickedButtonAtIndex:daripada hardcoding 0 atau hal serupa). Menjijikkan dengan mengubah menjadi NSArraymenjadi va_listjuga tidak terdengar seperti solusi yang bagus. :-( API ini sangat jelek.
Daniel Rinser
78

Satu catatan kecil: [actionSheet addButtonWithTitle:] mengembalikan indeks tombol itu, jadi agar aman dan "bersih" Anda dapat melakukan ini:

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];
Nick
sumber
Akankah tombol batal berubah menjadi merah?
pengguna4951
1
@JimThio Tidak, tombol merah disebut "destructiveButton", dan ada properti masing-masing destructiveButtonIndexuntuknya
Nick
3

Mengambil jawaban Jaba dan Nick dan memperluasnya sedikit lebih jauh. Untuk memasukkan tombol penghancur ke dalam solusi ini:

// 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];
Stephen Donnell
sumber
1

Ada versi cepat untuk tanggapannya:

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

Untuk mendapatkan nilai yang dipilih, tambahkan delegasi ke ViewController Anda:

class MyViewController: UIViewController, UIActionSheetDelegate

Dan terapkan metode "clickedButtonAtIndex"

func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
    let selectedValue : String = values[buttonIndex]
}
Kevin ABRIOUX
sumber
Untuk pengguna di masa mendatang ...
Berhasil