У меня есть табличное представление, которое при загрузке каждая ячейка может возвращать NSError, который я выбрал для отображения в UIAlertController. Проблема в том, что я получаю эту ошибку в консоли, если возвращается несколько ошибок.
Предупреждение: Попытка представить UIAlertController: 0x14e64cb00 в MessagesMasterVC: 0x14e53d800, который уже представлен (null)
В идеале я хотел бы обработать это в моем методе расширения 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
}
Основываясь на ответе Мэтта, я изменил расширение на расширение UIViewController, оно намного чище и сохраняет много кода 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
скрытое имя пользователя
источник
источник
Ответы:
Это не UIAlertController, который «уже представляет», это MessagesMasterVC. Контроллер представления может одновременно представлять только один другой контроллер представления. Отсюда и сообщение об ошибке.
Другими словами, если вы сказали контроллеру представления
presentViewController:...
, вы не можете сделать это снова, пока представленный контроллер представления не будет отклонен.Вы можете спросить MessagesMasterVC, представляет ли он уже контроллер представления, проверив его
presentedViewController
. Если нетnil
, не сообщайте об этомpresentViewController:...
- он уже представляет контроллер представления.источник
источник
UIAlertController
стрельбу в короткой последовательности. Проверьте это, если у вас есть аналогичная проблема.Что ж, у предложенных выше решений есть существенная проблема, с моей точки зрения:
Если вы спросите свой ViewController, равен ли атрибут «presentViewController» нулю, а ответ - ложь, вы не сможете прийти к выводу, что ваш UIAlertController уже представлен. Это может быть любой представленный ViewController, например popOver. Итак, мое предложение обязательно проверить, отображается ли предупреждение уже на экране, следующее (приведите представленныйViewController как UIAlertController):
}
источник
Вот решение, которое я использую в Swift 3. Это функция, которая показывает предупреждение пользователю, и если вы вызовете ее несколько раз, прежде чем пользователь отклонит предупреждение, она добавит новый текст предупреждения в предупреждение, которое уже представлено. . Если отображается другое представление, предупреждение не появится. Не все согласятся с таким поведением, но оно хорошо работает в простых ситуациях.
источник
Мы можем просто проверить, присутствует ли какой-либо контроллер представления.
если представлен, проверьте, является ли это типом UIAlertController.
источник
вы можете проверить - в одной строке - если предупреждение уже представлено:
источник
Эта категория может автоматически управлять всеми модальными контроллерами, включая UIAlertController.
UIViewController + JCPresentQueue.h
источник
Я использовал это для обнаружения, удаления и предупреждения.
Сначала мы создаем оповещение со следующей функцией.
И в какой-то другой части вашего кода
источник
Для последнего языка Swift вы можете использовать следующее:
источник
Отключите текущий контроллер и представьте контроллер предупреждений, например
источник
Для тех, кто не знает, как получить самый лучший Viewcontroller
Для тех, кто не знает, как получить самый лучший Viewcontroller
источник
Я обнаружил, что мне нужно создать очередь для стекирования запросов UIAlertController.
источник
Просто отклоните текущий контроллер и представьте тот, который вы хотите, т.е.
self.dismiss(animated: false, completion: nil)
self.displayAlertController()
источник