Saya memiliki tampilan tabel yang, ketika dimuat, setiap sel mungkin dapat mengembalikan NSError, yang telah saya pilih untuk ditampilkan di UIAlertController. Masalahnya adalah saya mendapatkan kesalahan ini di konsol jika beberapa kesalahan dikembalikan.
Peringatan: Mencoba menampilkan UIAlertController: 0x14e64cb00 di MessagesMasterVC: 0x14e53d800 yang sudah ada (null)
Idealnya, saya idealnya ingin menangani ini dalam metode ekstensi UIAlertController saya.
class func simpleAlertWithMessage(message: String!) -> UIAlertController {
let alertController = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.Alert)
let cancel = UIAlertAction(title: "Ok", style: .Cancel, handler: nil)
alertController.addAction(cancel)
return alertController
}
Berdasarkan jawaban matt, saya mengubah ekstensi ke ekstensi UIViewController, jauh lebih bersih dan menghemat banyak kode presentViewController.
func showSimpleAlertWithMessage(message: String!) {
let alertController = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.Alert)
let cancel = UIAlertAction(title: "Ok", style: .Cancel, handler: nil)
alertController.addAction(cancel)
if self.presentedViewController == nil {
self.presentViewController(alertController, animated: true, completion: nil)
}
}
ios
uialertcontroller
nama pengguna tersembunyi
sumber
sumber
Jawaban:
Bukan UIAlertController yang "sudah ditampilkan", melainkan MessagesMasterVC. Pengontrol tampilan hanya dapat menampilkan satu pengontrol tampilan lain dalam satu waktu. Karenanya pesan kesalahannya.
Dengan kata lain, jika Anda telah memberi tahu pengontrol tampilan untuk
presentViewController:...
, Anda tidak dapat melakukannya lagi hingga pengontrol tampilan yang disajikan telah ditutup.Anda dapat menanyakan MessagesMasterVC apakah sudah menampilkan pengontrol tampilan dengan memeriksanya
presentedViewController
. Jika tidaknil
, jangan beri tahupresentViewController:...
- ini sudah menampilkan pengontrol tampilan.sumber
sumber
UIAlertController
pengaktifan secara berurutan. Periksa ini jika Anda memiliki masalah serupa.Nah, solusi yang disarankan di atas memiliki masalah penting dari sudut pandang saya:
Jika Anda bertanya pada ViewController Anda, apakah atribut 'presentationViewController' nihil dan jawabannya salah, Anda tidak bisa sampai pada kesimpulan, bahwa UIAlertController Anda sudah disajikan. Ini bisa berupa ViewController yang disajikan, misalnya popOver. Jadi saran saya untuk memeriksa, apakah Alert sudah ada di layar adalah sebagai berikut (mentransmisikan ViewController yang disajikan sebagai UIAlertController):
}
sumber
Berikut adalah solusi yang saya gunakan di Swift 3. Ini adalah fungsi yang menunjukkan peringatan kepada pengguna, dan jika Anda memanggilnya beberapa kali sebelum pengguna menutup peringatan, itu akan menambahkan teks peringatan baru ke peringatan yang sudah disajikan . Jika beberapa tampilan lain disajikan, peringatan tidak akan muncul. Tidak semua akan setuju dengan perilaku itu, tetapi itu bekerja dengan baik untuk situasi sederhana.
sumber
Kami hanya dapat memeriksa apakah ada pengontrol tampilan yang disajikan.
jika disajikan, periksa apakah itu jenis UIAlertController.
sumber
Anda dapat menguji - dalam satu baris - jika peringatan sudah ditampilkan:
sumber
Kategori ini dapat secara otomatis mengelola semua pengontrol modal termasuk UIAlertController.
UIViewController + JCPresentQueue.h
sumber
Saya menggunakan itu untuk mendeteksi dan menghapus dan memperingatkan.
Pertama kita membuat peringatan dengan fungsi berikut.
Dan di beberapa bagian lain kode Anda
sumber
Untuk bahasa Swift terbaru, Anda dapat menggunakan berikut ini:
sumber
Singkirkan pengontrol saat ini dan tampilkan pengontrol peringatan seperti
sumber
Bagi mereka yang tidak tahu bagaimana mendapatkan Viewcontroller teratas
Bagi mereka yang tidak tahu bagaimana mendapatkan Viewcontroller teratas
sumber
Saya menemukan saya perlu membuat antrian untuk menumpuk permintaan UIAlertController.
sumber
Tutup saja pengontrol saat ini dan tunjukkan pengontrol yang Anda inginkan, yaitu
self.dismiss(animated: false, completion: nil)
self.displayAlertController()
sumber