【发布时间】:2020-01-20 11:41:27
【问题描述】:
我正在按照与此应用 https://github.com/Bailig/SurveyApp 相同的设计方法制作应用。
在上面的 GitHub 项目中,控制器的设计方式类似于带有 ContainerView 的普通 ViewController。而且这个普通的 ViewController 是 Embed Segue 与第一个控制器或第一页。所有后续屏幕的容器视图都将被替换。
在上面的项目中,最后有一个感谢页面,在我的应用程序中,我在感谢页面上放置了一个按钮。我想通过点击感谢页面中的按钮再次打开第一页。如何从最后一页控制器/FourthController 执行此操作?
视图控制器
class ViewController: UIViewController {
var currentController: UIViewController?
var pageIndex = 1
var survey = Survey()
@IBOutlet weak var backButton: UIButton!
@IBOutlet weak var nextButton: UIButton!
@IBOutlet weak var containerView: UIView!
@IBOutlet weak var progressLabel: UILabel!
@IBAction func nextTapped(_ sender: Any) {
switch pageIndex {
case 1:
let nextController = storyboard?.instantiateViewController(withIdentifier: "SecondController")
if let fromController = currentController, let toController = nextController as? SecondController {
toController.survey = survey
moveAndSizeChildControllers(fromController: fromController, toController: toController)
pageIndex += 1
setButtonAndProgressLabel()
}
case 2:
let nextController = storyboard?.instantiateViewController(withIdentifier: "ThirdController")
if let fromController = currentController, let toController = nextController as? ThirdController {
toController.survey = survey
moveAndSizeChildControllers(fromController: fromController, toController: toController)
pageIndex += 1
setButtonAndProgressLabel()
}
case 3:
let nextController = storyboard?.instantiateViewController(withIdentifier: "FourthController")
if let fromController = currentController, let toController = nextController as? FourthController {
toController.survey = survey
moveAndSizeChildControllers(fromController: fromController, toController: toController)
pageIndex += 1
setButtonAndProgressLabel()
}
default:
break
}
}
@IBAction func backTapped(_ sender: Any) {
switch pageIndex {
case 2:
let nextController = storyboard?.instantiateViewController(withIdentifier: "FirstController")
if let fromController = currentController, let toController = nextController as? FirstController {
toController.survey = survey
moveAndSizeChildControllers(fromController: fromController, toController: toController)
pageIndex -= 1
setButtonAndProgressLabel()
}
case 3:
let nextController = storyboard?.instantiateViewController(withIdentifier: "SecondController")
if let fromController = currentController, let toController = nextController as? SecondController {
toController.survey = survey
moveAndSizeChildControllers(fromController: fromController, toController: toController)
pageIndex -= 1
setButtonAndProgressLabel()
}
default:
break
}
}
@IBOutlet weak var backTapped: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
currentController = segue.destination
if let firstController = currentController as? FirstController {
firstController.survey = survey
}
setButtonAndProgressLabel()
}
func moveAndSizeChildControllers(fromController: UIViewController, toController: UIViewController) {
fromController.willMove(toParentViewController: nil)
toController.view.frame = containerView.bounds
addChildViewController(toController)
containerView.addSubview(toController.view)
// animatin
toController.view.alpha = 0
UIView.animate(withDuration: 0.5, animations: {
toController.view.alpha = 1
fromController.view.alpha = 0
}) { (completed) in
fromController.view.removeFromSuperview()
fromController.removeFromParentViewController()
toController.didMove(toParentViewController: self)
self.currentController = toController
}
}
}
【问题讨论】:
标签: ios swift uiviewcontroller segue uistoryboardsegue