Предупреждение. Попробуйте представить <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)
}