gpt4 book ai didi

ios - 在同一容器 View 中从一个 View Controller 切换到另一个 View Controller

转载 作者:行者123 更新时间:2023-11-28 06:14:49 24 4
gpt4 key购买 nike

我有两个 View Controller :ViewControllerAViewControllerBViewControllerA 被添加到容器 View 中并且它有按钮。点击按钮时,ViewControllerB 应该替换 ViewControllerA。我怎样才能做到这一点?问题是按钮位于 ViewControllerB 中,而不是在主视图 Controller 中。

主要ViewController:

class ViewController: UIViewController {

@IBOutlet weak var containerView: UIView!
weak var currentViewController: UIViewController?

override func viewDidLoad() {
self.currentViewController = self.storyboard?.instantiateViewController(withIdentifier: "Verify")
self.currentViewController!.view.translatesAutoresizingMaskIntoConstraints = false
self.addChildViewController(self.currentViewController!)
self.initializeFirstScreen(subView: self.currentViewController!.view, toView: self.containerView)

super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}

func initializeFirstScreen(subView:UIView, toView parentView:UIView){

parentView.addSubview(subView)

var viewBindingDict = [String: AnyObject]()
viewBindingDict["subView"] = subView
parentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[subView]|", options: [], metrics: nil, views: viewBindingDict))
parentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[subView]|", options: [], metrics: nil, views: viewBindingDict))
}

func switchToValidate(){

let newViewController = self.storyboard?.instantiateViewController(withIdentifier: "Validate")

//this line throws error
//fatal error: unexpectedly found nil while unwrapping an Optional value
newViewController!.view.translatesAutoresizingMaskIntoConstraints = false
self.addChildViewController(newViewController!)
initializeFirstScreen(subView: (newViewController?.view)!, toView: self.containerView)

}
}

ViewControllerA:

class VerifyViewController: UIViewController {

let mainViewController = ViewController()

@IBAction func VerifyNumber(){

self.switchScreens()

}


func switchScreens(){

mainViewController.switchToValidate()

}
}

switchToValidate 抛出以下错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

最佳答案

我在理解您的代码方面遇到了一些困难。

如果需要在 ViewControllerA 中维护按钮,则应在其中注入(inject)主视图 Controller 的引用。在 ViewControllerA 中,您正在创建 ViewController 的新实例。

所以,在 ViewController 中,而不是做(你在这里创建一个全新的 Controller ):

let viewController = ViewController()

你需要有这样的东西:

weak var mainViewController: ViewController?

viewDidLoad 中,您可以在 ViewControllerA 中注入(inject)该属性,例如:

if let viewControllerA = 
self.storyboard?.instantiateViewController(withIdentifier: "Validate") as? ViewControllerA {
viewControllerA.mainViewController = self
// other code here
}

现在,在 ViewControllerA 中,您有一个对主 Controller 的引用,您可以切换到另一个 Controller 。

一些注意事项:

  • super.viewDidLoad() 应该在覆盖 viewDidLoad 时作为第一条指令调用
  • 更喜欢if let(或guard)语法而不是!,以便处理可选项。显然,除非有必要。

关于ios - 在同一容器 View 中从一个 View Controller 切换到另一个 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45477338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com