ActionSheet tidak berfungsi pada iPad

86

Saya menggunakan ActionSheet dalam aplikasi saya. Di iPhone saya berfungsi, tetapi tidak di simulator iPad.

ini kode saya:

@IBAction func dialog(sender: AnyObject) {

    let optionMenu = UIAlertController(title: nil, message: "Choose Option", preferredStyle: .ActionSheet)
    let deleteAction = UIAlertAction(title: "Delete", style: .Default, handler: {

        (alert: UIAlertAction!) -> Void in
        println("Filtre Deleted")
    })

    let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: {
        (alert: UIAlertAction!) -> Void in
        println("Cancelled")
    })

    optionMenu.addAction(deleteAction)
    optionMenu.addAction(cancelAction)

    self.presentViewController(optionMenu, animated: true, completion: nil)
}

Dan kesalahan saya:

Menghentikan aplikasi karena pengecualian 'NSGenericException' yang tidak tertangkap, alasan: 'Aplikasi Anda telah menampilkan UIAlertController () dengan gaya UIAlertControllerStyleActionSheet. ModalPresentationStyle dari UIAlertController dengan gaya ini adalah UIModalPresentationPopover. Anda harus memberikan informasi lokasi untuk popover ini melalui popoverPresentationController pengontrol peringatan. Anda harus menyediakan sourceView dan sourceRect atau barButtonItem. Jika informasi ini tidak diketahui saat Anda menampilkan pengontrol peringatan, Anda dapat memberikannya dalam metode UIPopoverPresentationControllerDelegate -prepareForPopoverPresentation. '

Stephany
sumber
Link ini dapat membantu Anda.
Nimisha Patel
4
ios 8 dan di atasnya tidak ada lembar tindakan contoh UIActionController u perlu mengatur tipe sebagai UIAlertControllerStyleActionSheet .... ini dapat membantu Anda .... meskipun uipopover disarankan untuk iPad ....
Arun
Anda harus menampilkannya sebagai popover di iPad
Totka

Jawaban:

110

Anda perlu menyediakan tampilan sumber atau tombol sebelum menyajikan optionMenu karena di iPad ini adalah UIPopoverPresentationController, Seperti yang dikatakan dalam kesalahan Anda. Ini hanya berarti bahwa lembar tindakan Anda mengarah ke tombol yang memberi tahu pengguna dari mana mulainya.

Misalnya jika Anda mempresentasikan optionMenu Anda dengan mengetuk item bilah navigasi kanan. Anda bisa melakukan sesuatu seperti ini:

optionMenu.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem

self.presentViewController(optionMenu, animated: true, completion: nil)

atau Anda dapat mengatur tampilan seperti ini: (Anda hanya perlu salah satu dari 2 ini)

optionMenu.popoverPresentationController?.sourceView = yourView

self.presentViewController(optionMenu, animated: true, completion: nil)

Juga perlu diingat bahwa jika Anda mengubah UIAlertControllerStyle Anda menjadi Alert sebagai ganti lembar tindakan, Anda tidak perlu menentukan ini. Saya yakin Anda pasti sudah menemukannya tetapi saya hanya ingin membantu siapa saja yang menemukan halaman ini.

MD Singh
sumber
31

Masalah yang sama bagi saya. Saya memiliki UIAlertController yang berfungsi dengan baik di ponsel, tetapi macet di iPad. Lembar akan muncul saat sel diketuk dari tampilan tabel.

Untuk Swift 3, saya menambahkan 3 baris kode tepat sebelum menampilkannya:

        ...

        sheet.popoverPresentationController?.sourceView = self.view
        sheet.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection()
        sheet.popoverPresentationController?.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)


        self.present(sheet, animated: true, completion: nil)
Zach
sumber
1
Ini berfungsi untuk saya di Swift 5.0 tetapi saya tidak tahu cara menampilkan pop-up dari bawah tampilan. Terima kasih!
Florentin Lupascu
@FlorentinLupascu: Cukup setel AllowedArrowDirections ke UIPopoverArrowDirection.Down dan sourceRect = CGRect (x: self.view.bounds.midX, y: self.view.bounds.bottom, lebar: 0, tinggi: 0)
terlalu
24

Cepat 3

Seperti yang dikatakan sebelumnya, Anda harus mengkonfigurasi UIAlertController agar disajikan pada titik tertentu di iPAD.

Contoh bilah navigasi:

    // 1
    let optionMenu = UIAlertController(title: nil, message: "Choose an option", preferredStyle: .actionSheet)

    // 2
    let deleteAction = UIAlertAction(title: "Option 1", style: .default, handler: {
        (alert: UIAlertAction!) -> Void in
        print("option 1 pressed")
    })
    let saveAction = UIAlertAction(title: "Option 2", style: .default, handler: {
        (alert: UIAlertAction!) -> Void in
        print("option 2 pressed")
    })

    //
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: {
        (alert: UIAlertAction!) -> Void in
        print("Cancelled")
    })


    // 4

    optionMenu.addAction(deleteAction)
    optionMenu.addAction(saveAction)
    optionMenu.addAction(cancelAction)

    // 5

    optionMenu.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem

    self.present(optionMenu, animated: true) { 
        print("option menu presented")
    }
mourodrigo
sumber
8

Jika Anda ingin menampilkannya di tengah tanpa panah [ Swift 3+ ]:

if let popoverController = optionMenu.popoverPresentationController {
        popoverController.sourceView = self.view
        popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
        popoverController.permittedArrowDirections = []
    }
self.present(optionMenu, animated: true, completion: nil)
Mohit Singh
sumber
5

tambahkan pernyataan dalam istilah berikut sebelum disajikan.

optionMenu.popoverPresentationController.sourceView = self.view;
optionMenu.popoverPresentationController.sourceRect = 

CGRectMake(0,0,1.0,1.0);


@IBAction func dialog(sender: AnyObject) {
    ...

    optionMenu.popoverPresentationController.sourceView = self.view;
    optionMenu.popoverPresentationController.sourceRect = CGRectMake(0,0,1.0,1.0);

    self.presentViewController(optionMenu, animated: true, completion: nil)
}

itu akan bekerja dengan baik.

Jimmy chou
sumber
Bekerja dengan sempurna. Satu-satunya hal adalah Anda perlu menambahkan Item bilah Navigasi Kiri, sehingga menu popover sepertinya tidak muncul begitu saja
Eugene Pavlov
0

Perlu diketahui bahwa Anda juga bisa mendapatkan kesalahan ini jika Anda belum menautkan tampilan sumber di IB ke variabel yang relevan di aplikasi Anda.

Peter Johnson
sumber
0

Anda perlu menambahkan ini untuk Ipad

alertControler.popoverPresentationController?.sourceView = self.view

Asad Farooq
sumber