警告:尝试在&lt; ...&gt;上显示<uialertcontroller:0x7facd3946920 =“”>已经呈现(null)

时间:2015-05-20 01:19:26

标签: ios uitableview swift uialertcontroller

我在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语句中执行。将显示警报,并将文本打印到控制台。这是一个问题吗?

编辑:正如Matt所说,我的所有代码都没有在手势识别器测试的范围内。移动它解决我的问题。测试之外的代码执行了两次,导致UIAlertController被呈现两次。

4 个答案:

答案 0 :(得分:18)

  

出于某种原因,这两段代码都在if

中执行

那对我来说应该响起警钟。 ifelse都不可能运行。此代码必须运行两次。

那是因为你没有测试手势识别器的状态。长按g.r.发送其动作消息两次。您在长按和发布时都运行此代码。你需要测试g.r的状态。所以你不要这样做。例如:

@IBAction func longPressedView(g: UIGestureRecognizer) {
    if g.state == .Began {
        // ... do it all here
    }
}

答案 1 :(得分:12)

我遇到了同样的问题。 我能够通过这段代码修复它:

        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)
        }

答案 2 :(得分:0)

您应该区分手势状态然后执行您想要的代码,否则您添加到目标的选择器将在手势状态为UIGestureRecognizerStateBegan时第一次执行,第二次手势状态为{{1时执行第二个性能,alertController正在显示,因此Xcode将记录警告。

答案 3 :(得分:0)

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)
}