如何在触发退出 segue 之前执行操作?

Posted

技术标签:

【中文标题】如何在触发退出 segue 之前执行操作?【英文标题】:How to perform action before triggering exit segue? 【发布时间】:2015-04-09 23:13:18 【问题描述】:

我已经创建了一个从视图控制器 A 到视图控制器 B 的 segue(当前模态),它通过视图控制器 A 的导航控制器中的按钮触发。接管的模态用于通过键入发送朋友请求一封电邮。当用户输入电子邮件并按下按钮提交好友请求时,我想执行由按钮触发的操作(调用服务器发送好友请求,如果电子邮件存在则返回成功,如果电子邮件不存在则返回错误不存在)。如果成功,我想退出/展开segue回到A。如果错误,我不想退出/展开segue。

我已经研究了this 问题,但它似乎没有实现我所需要的。我正在尝试以下方法:

class BViewController: UIViewController 
    // The button function
    @IBAction func sendFriendRequest(sender: AnyObject) 
        println("Button Function.")
        self.performSegueWithIdentifier("SendFriendRequest", sender: self)
    

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        if segue.identifier == "SendFriendRequest" 
            println("Preparing for segue.")
        
    

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


然后在第一个视图控制器中:

AViewController: UIViewController 
    // The unwind function
    @IBAction func saveFriendRequest(segue:UIStoryboardSegue) 
        println("Finished the segue.")
    

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

这是我为按钮设置退出 segue 时的结果(在 ViewController 中按住 ctrl 并拖动按钮到“退出”),我按以下顺序获得调用:

Preparing for segue.
Finished the segue.
Button Function.

但是,我不一定要每次都调用 prepareForSegue 或 unwind 函数,只要服务器给出成功消息。那么我将如何连接情节提要中的内容,以便在调用 performSegueWithIdentifier 时不必调用其他函数(prepareForSegue 等)?

【问题讨论】:

【参考方案1】:

从按钮中删除退出转场,而只需将按钮链接到新的 IBAction 并插入

self.dismissViewControllerAnimated(true, completion: nil)

因此,您的新代码将是:

@IBAction func saveFriendRequest(sender: AnyObject) 
   //Do your stuff to save the friend request
   self.dismissViewControllerAnimated(true, completion: nil)

【讨论】:

感谢您的帮助,这正是我所需要的!【参考方案2】:

如果要在segue之前执行action,创建if-statement来判断action是否成功完成,然后执行segue。即。

if (ActionSuccess) 
self.performSegueWithIdentifier("Segue", sender: nil)

【讨论】:

是的,这将是需要的,很抱歉没有澄清这一点。如何在不将按钮附加到视图控制器上的出口的情况下使 segue 工作,因为通过附加它,它会在执行按钮操作之前执行 prepareForSegue 并展开?

以上是关于如何在触发退出 segue 之前执行操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式执行Unwind segue?

在执行 segue 之前如何显示加载指示器?

在没有底层闪存的情况下,如何在视图出现之前执行Segue?

如何执行条件转场

在 Swift 中使用 shouldPerformSegue() 检查字段后如何继续使用 segue

如何从标签栏控制器执行 show segue?