在同一个容器视图中从一个视图控制器切换到另一个视图
问题描述:
我有两个视图控制器:ViewControllerA
和ViewControllerB
。 ViewControllerA
被添加到一个容器视图,它有按钮。点击按钮时,ViewControllerB
应取代ViewControllerA
。我怎样才能做到这一点?问题在于该按钮位于ViewControllerB
之内,而不在主视图控制器中。在同一个容器视图中从一个视图控制器切换到另一个视图
主要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
中的按钮,则应在其中注入主视图控制器的引用。在ViewControllerA
中,您正在创建ViewController
的新实例。
因此,内ViewController
,而不是做(你在这里创建一个全新的控制器):
let viewController = ViewController()
,你需要有这样的事情:
weak var mainViewController: ViewController?
在viewDidLoad
你可以注入在ViewControllerA
之内属性:
if let viewControllerA =
self.storyboard?.instantiateViewController(withIdentifier: "Validate") as? ViewControllerA {
viewControllerA.mainViewController = self
// other code here
}
现在,在ViewControllerA
中,您可以参考主控制器,您可以切换到另一个控制器。
几点注意事项:
-
super.viewDidLoad()
应覆盖viewDidLoad
- 时,被称为第一请示,以应对自选喜欢
if let
(或guard
)语法!
。显然除非是必要的。
我们需要一些代码来帮助您 – pierreafranck
试试这个,让我知道。 self.currentViewController = self.storyboard?.instantiateViewController(withIdentifier:“Verify”)as! VerifyViewController self.currentViewController.mainViewController = self –
这部分内容不清楚self.currentViewController.mainViewController = self currentViewController没有mainViewController – kosas