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. '
sumber
Jawaban:
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.
sumber
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)
sumber
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") }
sumber
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)
sumber
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.
sumber
Perlu diketahui bahwa Anda juga bisa mendapatkan kesalahan ini jika Anda belum menautkan tampilan sumber di IB ke variabel yang relevan di aplikasi Anda.
sumber
Anda perlu menambahkan ini untuk Ipad
alertControler.popoverPresentationController?.sourceView = self.view
sumber
Saya telah melakukan paket ini untuk mengelola ActionSheet dan Popover di iPhone, Ipad dan Mac. https://github.com/AndreaMiotto/ActionOver
sumber