Предупреждение. Попробуйте представить <UIAlertController: 0x7facd3946920> в <...>, который уже представляет (null)
У меня есть длинный жест нажатия, установленный на UITableView
, который представляет UIAlertController
, содержащий текст ячейки. Когда представлен UIAlertController
, я получаю это предупреждение:
Attempt to present <UIAlertController: 0x7fd57384e8e0> on <TaskAppV2.MainTaskView: 0x7fd571701150> which is already presenting (null)
Из моего понимания, MainTaskView (UITableView
) уже представляет представление, поэтому он не должен представлять второй вид, UIAlertController.
Итак, я попробовал this решение по аналогичному вопросу. Это не работает, поскольку я получаю такое же предупреждение. Что я могу сделать, чтобы решить это предупреждение? См. Ниже код:
func longPressedView(gestureRecognizer: UIGestureRecognizer){
/*Get cell info from where user tapped*/
if (gestureRecognizer.state == UIGestureRecognizerState.Ended) {
var tapLocation: CGPoint = gestureRecognizer.locationInView(self.tableView)
var tappedIndexPath: NSIndexPath? = self.tableView.indexPathForRowAtPoint(tapLocation)
if (tappedIndexPath != nil) {
var tappedCell: UITableViewCell? = self.tableView.cellForRowAtIndexPath(tappedIndexPath!)
println("the cell task name is \(tappedCell!.textLabel!.text!)")
} else {
println("You didn't tap on a cell")
}
}
/*Long press alert*/
let tapAlert = UIAlertController(title: "Long Pressed", message: "You just long pressed the long press view", preferredStyle: UIAlertControllerStyle.Alert)
tapAlert.addAction(UIAlertAction(title: "OK", style: .Destructive, handler: nil))
/*
if (self.presentedViewController == nil) {
self.presentViewController(tapAlert, animated: true, completion: nil)
} else {
println("already presenting a view")
} */
self.presentViewController(tapAlert, animated: true, completion: nil)
println("presented")
}
Выход консоли:
presented
You didn't tap on a cell
2015-05-19 22:46:35.692 TaskAppV2[60765:3235207] Warning: Attempt to present <UIAlertController: 0x7fc689e05d80> on <TaskAppV2.MainTaskView: 0x7fc689fc33f0> which is already presenting (null)
presented
По какой-то причине обе части кода выполняются в инструкции if, когда происходит длительный жест нажатия. Появляется предупреждение, и текст печатается на консоли. Это проблема?
Изменить: Как сказал Мэтт, у меня не было всего моего кода в рамках теста распознавания жестов. Перемещение этого в моей проблеме. Код за пределами теста выполнялся дважды, в результате чего UIAlertController
представлялся дважды.
Ответы
Ответ 1
По какой-то причине обе части кода выполняются в if
У меня должны были быть колокольчики для меня. Невозможно, чтобы выполнялись как if
, так и else
. Этот код должен работать дважды.
Это потому, что вы не проверяете состояние распознавателя жестов. Длительное нажатие g.r. отправляет свое действие дважды. Вы выполняете этот код как при длительном нажатии, так и при отпускании. Вам нужно проверить состояние g.r. так что вы этого не делаете. Пример:
@IBAction func longPressedView(g: UIGestureRecognizer) {
if g.state == .Began {
// ... do it all here
}
}
Ответ 2
У меня была такая же проблема.
Я смог исправить это с помощью этого кода:
if self.presentedViewController == nil {
self.present(Alert, animated: true, completion: nil)
}
else {
self.dismiss(animated: false, completion: nil)
self.present(Alert, animated: true, completion: nil)
}
Ответ 3
Вы должны отличить состояние жестов, а затем выполнить нужный код, если не будет выбран селектор, который вы добавите в цель, первый раз, когда состояние жестов UIGestureRecognizerStateBegan
и второй раз, когда состояние жестов UIGestureRecognizerStateCancelled
, вторая производительность, alertController показывает, поэтому Xcode будет регистрировать предупреждение.
Ответ 4
0
Отключить текущий контроллер и представить контроллер предупреждений как
func alert(_ message:String) {
let alert = UIAlertController(title: "Error!", message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Dismiss", style: .default, handler: nil))
self.dismiss(animated: false, completion: nil)
self.present(alert, animated: true,completion: nil)
}