警告:尝试在已呈现的 <...> 上呈现 <UIAlertController: 0x7facd3946920> (null)

Posted

技术标签:

【中文标题】警告:尝试在已呈现的 <...> 上呈现 <UIAlertController: 0x7facd3946920> (null)【英文标题】:Warning: Attempt to present <UIAlertController: 0x7facd3946920> on <...> which is already presenting (null) 【发布时间】:2015-05-20 01:19:25 【问题描述】:

我在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 出现两次。

【问题讨论】:

能看到相关代码吗?视图 controllers 呈现其他 controllers,因此您的 UITableView 应该不是问题。看来您有点混淆了视图和控制器。 您链接到的问题的公认答案似乎很清楚。您可以在您的问题中添加一些相关代码吗? 好的,给我几分钟。 "这行代码使警告静音" 因为它完全不同。而不是解雇现有的提出的v.c.并呈现一个新的,你现在有 两个 呈现的视图控制器一个在另一个之上。如果这就是你想要的,那很好。但请确保它是。 我认为这是因为长按表格单元格会召唤菜单。你和那个有冲突。我在下面的回答可能让我们摆脱困境。 【参考方案1】:

由于某种原因,这两段代码都在 if 中执行

这应该给我敲响了警钟。 ifelse 不可能同时运行。此代码必须运行两次。

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

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

【讨论】:

我在这个类中唯一的其他presentViewController 只有在表格处于编辑模式时才有可能。 天才!我在presentViewController 下放了一个println(),每次长按都会执行两次。 我明白了。这是因为您没有测试长按的状态。修改了我的答案(我认为这是最后一次)。 但是有你的问题。您的警报内容不在测试中!把它移进去。否则它会发生两次。 天哪,我很抱歉浪费了您的时间...几天前我买了您的两本关于 ios 8 编程的书,并且读起来很开心。我希望他们能帮助我学习所有这些东西。【参考方案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)

【讨论】:

以上是关于警告:尝试在已呈现的 <...> 上呈现 <UIAlertController: 0x7facd3946920> (null)的主要内容,如果未能解决你的问题,请参考以下文章

警告:尝试在已呈现 <UISearchController: 0x142a1f7c0> 的 * 上呈现视图控制器

警告:尝试在已呈现的*上显示View Controller

在已卸载的组件中发出有关setState的警告

呈现模态视图总是失败

Xamarin.Forms 警告:尝试使用 iOS 图像/手势识别器在其视图不在窗口层次结构中的 * 上呈现 *

警告:尝试在已经呈现的 MainTableViewController 上呈现 ModalTableViewController (null)