Mam widok tabeli, który po załadowaniu, każda komórka mogłaby prawdopodobnie zwrócić NSError, który wybrałem do wyświetlenia w UIAlertController. Problem polega na tym, że otrzymuję ten błąd w konsoli, jeśli zwracanych jest wiele błędów.
Ostrzeżenie: próba przedstawienia kontrolera UIAlertController: 0x14e64cb00 na MessagesMasterVC: 0x14e53d800, która jest już prezentowana (null)
Idealnie byłoby, gdyby chciał poradzić sobie z tym w mojej metodzie rozszerzenia UIAlertController.
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
}
W oparciu o odpowiedź Matta zmieniłem rozszerzenie na rozszerzenie UIViewController, jest znacznie czystsze i oszczędza dużo kodu 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
ukryta nazwa użytkownika
źródło
źródło
Odpowiedzi:
To nie UIAlertController „już prezentuje”, jest to MessagesMasterVC. Kontroler widoku może jednocześnie prezentować tylko jeden inny kontroler widoku. Stąd komunikat o błędzie.
Innymi słowy, jeśli nakazałeś kontrolerowi widoku
presentViewController:...
, nie możesz tego zrobić ponownie, dopóki przedstawiony kontroler widoku nie zostanie odrzucony.Możesz zapytać MessagesMasterVC, czy już prezentuje kontroler widoku, sprawdzając jego
presentedViewController
. Jeśli nienil
, nie mów mupresentViewController:...
- już przedstawia kontroler widoku.źródło
źródło
UIAlertController
odpalenie w krótkich odstępach czasu. Sprawdź to, jeśli masz podobny problem.Cóż, powyższe sugerowane rozwiązania mają zasadniczy problem z mojego punktu widzenia:
Jeśli zapytasz swojego ViewController, czy atrybut „presentViewController” jest zerowy i odpowiedź jest fałszywa, nie możesz dojść do wniosku, że twój UIAlertController jest już przedstawiony. Może to być dowolny przedstawiony ViewController, np. PopOver. Więc moja sugestia, aby na pewno sprawdzić, czy Alert jest już na ekranie, jest następująca (rzut presentViewController jako UIAlertController):
}
źródło
Oto rozwiązanie, którego używam w Swift 3. Jest to funkcja, która pokazuje alert użytkownikowi i jeśli wywołasz ją wiele razy, zanim użytkownik odrzuci alert, doda nowy tekst alertu do już wyświetlanego alertu . Jeśli prezentowany jest inny widok, alert nie pojawi się. Nie wszyscy zgodzą się z tym zachowaniem, ale sprawdza się to w prostych sytuacjach.
źródło
Możemy po prostu sprawdzić, czy jest przedstawiony kontroler widoku.
jeśli jest wyświetlany, sprawdź, czy jest to rodzaj UIAlertController.
źródło
możesz sprawdzić - w jednej linii - czy alert już się pojawił:
źródło
Ta kategoria może automatycznie zarządzać wszystkimi kontrolerami modalnymi, w tym UIAlertController.
UIViewController + JCPresentQueue.h
źródło
Użyłem tego do wykrywania, usuwania i ostrzegania.
Najpierw tworzymy alert z następującą funkcją.
I w innej części twojego kodu
źródło
W przypadku najnowszego języka Swift możesz użyć następujących opcji:
źródło
Odrzuć bieżący kontroler i przedstaw kontroler alertów jak
źródło
Dla tych, którzy nie wiedzą, jak zdobyć najwyższy poziom Viewcontroller
Dla tych, którzy nie wiedzą, jak zdobyć najwyższy poziom Viewcontroller
źródło
Okazało się, że muszę utworzyć kolejkę do układania żądań UIAlertController.
źródło
Po prostu zamknij bieżący kontroler i przedstaw ten, który chcesz, tj
self.dismiss(animated: false, completion: nil)
self.displayAlertController()
źródło