我有一个用户注册过程,分为3个屏幕。第一个屏幕让用户输入他的手机号码,第二个屏幕要求他选择他的位置&第三个屏幕要求他输入他的生日和其他一些细节。
所以总共有3个控制器我已经使用过并按以下顺序显示。
1)mobile_number_controller.rb 2)location_controller.rb 3)miscellaneous_details_controller.rb
因此,我将此作为控制器链呈现,所有使用模态segue作为讨论here的结果。现在,我对退缩感到困惑。我想到的问题是
1)是否可以在呈现控制器链中向上取回控制器,而不是直接呈现当前控制器的控制器,即从 miscellaneous_details_controller 到 mobile_number_controller ?如果可能,这是一种正确的方法吗?
2)如果1)是可能的,那么链中的其他控制器会发生什么,即当前控制器和现在控制器之间的所有控制器都在我们现在解开的链中,即 location_controller ?我是否必须逐个手动解除所有控制器,我该怎么做?
请建议正确的方法来解决这个问题。任何帮助都会很有用,因为我刚开始使用iOS开发。
答案 0 :(得分:2)
最简单的方法是不要使用unwind segue。只需致电dismissViewControllerAnimated:completion:
,将发送到您要回送到的视图控制器实例。这将导致所有呈现的视图控制器一直被移除回您发送的视图控制器。
你可以找出这是哪个视图控制器,因为有一串presentingViewController
个对象一直运行回来。换句话说,回过头来说,你说:
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
要回头两步,你说:
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
答案 1 :(得分:0)
我使用子视图控制器解决了这个问题。对于您显示的第一个视图控制器,以正常方式显示它:
self.presentViewController(myViewController, animated: true, completion: nil)
进入该视图控制器后,将后续视图控制器添加为子视图控制器。你必须手动为它设置动画,但这很简单:
addChildViewController(childViewController)
view.addSubview(childViewController.view)
childViewController.view.frame = view.bounds
let startTransform = CGAffineTransformMakeTranslation(0, CGRectGetMaxY(view.bounds))
childViewController.view.transform = startTransform
UIView.animateWithDuration(0.3, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .BeginFromCurrentState, animations: {
childViewController.view.transform = CGAffineTransformIdentity
}, completion: { (_) in
//I wanted to change my status bar color here, do whatever you need
UIApplication.sharedApplication().setStatusBarStyle(.Default, animated: true)
})
现在,如果你想解雇整个事情,你只需要打电话:
self.dismissViewControllerAnimated(true, completion: nil)
如果您只想解除childViewController,请重新设置视图控制器的动画,然后将其删除:
childViewController.view.transform = CGAffineTransformIdentity
UIView.animateWithDuration(0.3, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .BeginFromCurrentState, animations: {
let endTransform = CGAffineTransformMakeTranslation(0, CGRectGetMaxY(self.view.bounds))
childViewController.view.transform = endTransform
}, completion: { (_) in
//remove child view controller
childViewController.removeFromParentViewController()
childViewController.view.removeFromSuperview()
})