完成处理程序后执行Segue

Posted

技术标签:

【中文标题】完成处理程序后执行Segue【英文标题】:performSegue after completion handler 【发布时间】:2014-11-18 14:35:47 【问题描述】:

在下面回答

我遇到了一个小问题,你可以帮我解决。

我正在开发的应用程序允许您根据您的位置请求内容。

第一个 ViewController 在某种程度上是一种获取您的位置/指定位置 + 一些其他信息以针对特定答案的表单。

我需要执行一个 segue 以将“问题”变量传递到我的第二个 ViewController,在那里我根据问题详细信息加载带有查询的“答案”。

给我带来麻烦的是,每当问题进行地理定位时,我都无法使用 prepareForSegue 检索信息,因为它不等待制作(完成)geoPoint。第二个控制器显示我的纬度和经度为零。

我看到我可以使用“perfomSegueWithIdentifier”调用“prepareForSegue”方法,并在我的第二个视图控制器中检索信息,但它执行了两次转场...如何仅在我准备好但使用prepareForSegue 数据参数需要保留吗?

有没有办法使用 performSegue 将变量从一个控制器传递到另一个控制器? 任何帮助都会很棒。

另外,虽然我认为代码与我的问题无关,但这是我使用的代码。

地理定位方法

@IBAction func doPostQuestion(sender: UIButton) 

        var thereQ:PFObject = PFObject(className: "tquestion")

        if(somewhereLabel.text == "my location")
            println("Location is geolocalized")
            PFGeoPoint.geoPointForCurrentLocationInBackground 
                (geoPoint: PFGeoPoint!, error: NSError!) -> Void in
                if error == nil 
                    self.geoLati = geoPoint.latitude as Double
                    self.geoLong = geoPoint.longitude as Double
                    self.performSegueWithIdentifier("goto_results", sender:self)  // call prepareForSegue when ready but implies to have a segue done on click... (performed twiced)
                
            

        
        self.navigationController?.popToRootViewControllerAnimated(true)
    

prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

        if(segue.identifier == "goto_results")

                // Get Label
                let theDestination = (segue.destinationViewController as displayAnswersViewController)
                theDestination.lat = self.geoLati
                theDestination.lng = self.geoLong
        
    

答案解决方案:

按照建议,要解决此问题,您只需创建从 viewController1 到 viewController2 的 segue,而不是从按钮。这样,您可以使用无论如何都会调用 prepareForSegue 的“performSegue”方法以编程方式触发 prepareForSegue。

【问题讨论】:

您是否将 segue 从第一个视图控制器直接连接到第二个视图控制器,而不是从第一个视图控制器中的按钮? 我确实将 segue 从按钮连接到第二个控制器,是的。然后我将 prepareForSegue 与我的 segue 标识符一起使用。 segue 正在工作,只是我需要在执行 segue 之前等待本地化调用完成。如果它不等待另一侧的位置变量为零(第二个控制器) 如果你想以编程方式触发一个segue,你应该将segue从第一个视图控制器直接连接到第二个视图控制器。不要从按钮连接它,否则它会被调用两次。然后你可以在后台任务完成时触发它。 好吧,从没想过。我会试一试!谢谢 好的,它可以工作。您应该将此作为答案发布,我可以验证它。我已经编辑了我的问题以添加答案。谢谢! 【参考方案1】:

要解决这个问题,您只需创建从 viewController1 到 viewController2 的 segue,而不是从按钮创建。这样,您就可以使用无论如何都会调用 prepareForSegue 的“performSegue”方法以编程方式触发 prepareForSegue。

【讨论】:

以上是关于完成处理程序后执行Segue的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 segue 不等到完成处理程序完成?

如何在swift3中完成5个文件下载请求后执行segue

Firebase 下载/上传完成后进行 Segue

swift UIView 动画完成处理程序首先调用

如何在 AppDelegate 中执行 Segue?

如何使 segue 等待功能在按钮按下时完成?