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.


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

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

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

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

Untuk pengguna di masa mendatang ...
Berhasil
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.