如何在转场目标视图控制器中执行转场

Posted

技术标签:

【中文标题】如何在转场目标视图控制器中执行转场【英文标题】:how to perform a segue in segue destination view controller 【发布时间】:2020-01-18 14:50:30 【问题描述】:

在当前称为 OnBoarding 的视图控制器中,具有操作的按钮是这样的

@IBAction func jump(_ sender: Any) 
    if UserDefaults.standard.bool(forKey: "UserLog")
        self.performSegue(withIdentifier: "goHome", sender: nil)
    else
        self.performSegue(withIdentifier: "goLogin", sender: nil)
    

所以如果有登录用户回家,但不是信息然后登录,(ViewController),登录视图控制器有一个注册ViewController的segue,有一个返回按钮登录并在注册过程返回登录屏幕之后,所以现在在 onboardingViewController 操作而不是登录之后,应该注册下一个屏幕,我正在寻找一种方法来命令 loginviewController 从 onBoardingViewController 执行 segue。尝试了这段代码,但似乎不起作用。

 if segue.identifier == "goLogin"
        let vc = segue.destination as! ViewController
        vc.performSegue(withIdentifier: "register", sender: nil)
 

我正在寻找一种简单的方法来实现这一点,而无需在入职和注册之间进行直接切换,涉及创建新的切换或显示登录屏幕并处理是否显示的不同情况。

【问题讨论】:

【参考方案1】:

它不起作用,因为在调用 performSegue(withIdentifier:sender:) 方法时,vc 不在 window 层次结构中。

解决方案

调用performSegue(withIdentifier:sender:) 方法,一旦vc 出现在屏幕上。为此,请使用 UIViewController 类 perform(_:animated:completion:) 的方法。

if segue.identifier == "goLogin"
    let vc = segue.destination as! ViewController
    present(vc, animated: true, completion: 
        vc.performSegue(withIdentifier: "register", sender: nil)
    )

方法尾随闭包可以移到括号外

if segue.identifier == "goLogin"
    let vc = segue.destination as! ViewController
    present(vc, animated: true) 
        vc.performSegue(withIdentifier: "register", sender: nil)
    

【讨论】:

以上是关于如何在转场目标视图控制器中执行转场的主要内容,如果未能解决你的问题,请参考以下文章

如何解除模态转场,然后将转场推入新的视图控制器

由于没有标识符错误的转场,无法执行转场

如何以编程方式创建展开转场[重复]

如何执行从视图容器到另一个外部视图的转场?

如何在多个 .xib 文件之间执行展开转场(不使用情节提要)

禁用转场动画