Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何将两个视图控制器显示为模态,但仅为第二个视图控制器设置过渡动画?_Swift_Xcode_Modal Dialog_Segue - Fatal编程技术网

Swift 如何将两个视图控制器显示为模态,但仅为第二个视图控制器设置过渡动画?

Swift 如何将两个视图控制器显示为模态,但仅为第二个视图控制器设置过渡动画?,swift,xcode,modal-dialog,segue,Swift,Xcode,Modal Dialog,Segue,我在storyboad中有三个控制器(FirstVC、SecondVC、ThirdVC),导航是按顺序进行的:用户可以从FirstVC以模式显示SecondVC。然后从SecondVC以模态方式呈现ThirdVC。现在,我需要制作一些按钮,从FirstVC打开ThirdVC,但也会在两者之间打开SecondVC,所以当用户从ThirdVC按back/Cross时,他将返回SecondVC。所以,我不需要从FirstVC到SecondVC的动画,只需要转到SecondVC,然后只设置到ThirdV

我在storyboad中有三个控制器(FirstVC、SecondVC、ThirdVC),导航是按顺序进行的:用户可以从FirstVC以模式显示SecondVC。然后从SecondVC以模态方式呈现ThirdVC。现在,我需要制作一些按钮,从FirstVC打开ThirdVC,但也会在两者之间打开SecondVC,所以当用户从ThirdVC按back/Cross时,他将返回SecondVC。所以,我不需要从FirstVC到SecondVC的动画,只需要转到SecondVC,然后只设置到ThirdVC的动画过渡


我在push sague中发现了同样的问题。我需要和现在一样的行为方式

在呈现视图控制器的视图呈现之前,无法呈现视图控制器。因此,如果第二个视图控制器源自第一个视图控制器,则不可能同时呈现两个视图控制器——第一个视图控制器必须首先呈现其视图


但解决方案仍然相当基本。如果用户从A转到B,则表示B与正常情况类似。如果用户是从A到C,则表示C是从A到C,但C是一个容器视图控制器,有两个子项(B和C,C显然在顶部)。因此,当用户解除C时,他并不是真的解除任何东西,而是在视图外设置C动画以显示B(使用与解除相同的动画)。对于用户来说,它看起来都是一样的。

在呈现视图控制器的视图呈现之前,无法呈现视图控制器。因此,如果第二个视图控制器源自第一个视图控制器,则不可能同时呈现两个视图控制器——第一个视图控制器必须首先呈现其视图


但解决方案仍然相当基本。如果用户从A转到B,则表示B与正常情况类似。如果用户是从A到C,则表示C是从A到C,但C是一个容器视图控制器,有两个子项(B和C,C显然在顶部)。因此,当用户解除C时,他并不是真的解除任何东西,而是在视图外设置C动画以显示B(使用与解除相同的动画)。对于用户来说,它看起来都是一样的。

下面是层次结构 第一个VC代表第二个VC

let vc = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondVC") as! SecondVC
    present(vc, animated: true, completion: nil)
present(vc, animated: true, completion: nil)
UIView.animate(withDuration: 0.5, animations: { [weak self] in
        self?.view.frame = CGRect(x: 0, y: self?.view.frame.height ?? 0.0, width: self?.view.frame.width ?? 0.0, height: self?.view.frame.height ?? 0.0)
    }, completion: { [weak self] _ in
        self?.view.removeFromSuperview()
    })
第二个VC将添加第三个VC作为子视图并使其可见

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    let vc = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ThirdVC") as! ThirdVC
    self.addChild(vc)
    self.view.addSubview(vc.view)
}
当关闭第三个VC时,用动画将其从超级视图中移除,并显示第二个VC

let vc = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondVC") as! SecondVC
    present(vc, animated: true, completion: nil)
present(vc, animated: true, completion: nil)
UIView.animate(withDuration: 0.5, animations: { [weak self] in
        self?.view.frame = CGRect(x: 0, y: self?.view.frame.height ?? 0.0, width: self?.view.frame.width ?? 0.0, height: self?.view.frame.height ?? 0.0)
    }, completion: { [weak self] _ in
        self?.view.removeFromSuperview()
    })
解雇第二个VC并披露第一个VC

dismiss(animated: true, completion: nil)

下面是层次结构 第一个VC代表第二个VC

let vc = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondVC") as! SecondVC
    present(vc, animated: true, completion: nil)
present(vc, animated: true, completion: nil)
UIView.animate(withDuration: 0.5, animations: { [weak self] in
        self?.view.frame = CGRect(x: 0, y: self?.view.frame.height ?? 0.0, width: self?.view.frame.width ?? 0.0, height: self?.view.frame.height ?? 0.0)
    }, completion: { [weak self] _ in
        self?.view.removeFromSuperview()
    })
第二个VC将添加第三个VC作为子视图并使其可见

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    let vc = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ThirdVC") as! ThirdVC
    self.addChild(vc)
    self.view.addSubview(vc.view)
}
当关闭第三个VC时,用动画将其从超级视图中移除,并显示第二个VC

let vc = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondVC") as! SecondVC
    present(vc, animated: true, completion: nil)
present(vc, animated: true, completion: nil)
UIView.animate(withDuration: 0.5, animations: { [weak self] in
        self?.view.frame = CGRect(x: 0, y: self?.view.frame.height ?? 0.0, width: self?.view.frame.width ?? 0.0, height: self?.view.frame.height ?? 0.0)
    }, completion: { [weak self] _ in
        self?.view.removeFromSuperview()
    })
解雇第二个VC并披露第一个VC

dismiss(animated: true, completion: nil)

为第二个显示动画false,并在完成处理程序中为第三个显示动画?其正在工作,但为分秒,SecondVC在背景中可见。mmmmmm考虑解决方案,因为如果有办法实现,则必须像idk那样进行演示,或者是有可能的,但是可以像开箱思考一样,将第二个alpha中的视图设置为0或类似的东西,必须将其显示以添加到视图堆栈中,否则它不存在,必须先初始化它,以便您可以返回到它。您可以详细说明一下。为第二个显示动画false,并在完成处理程序中为第三个显示动画?它工作,但用于分秒,SecondVC在背景中可见。mmmmmm考虑解决方案,因为如果有办法实现,则必须像idk那样进行演示,或者是有可能的,但是可以像开箱思考一样,将第二个alpha中的视图设置为0或类似的东西,必须将其显示以添加到视图堆栈中,否则它就不存在了,必须先对它进行初始化,这样你就可以返回到它了。你能详细说明一下吗。