2017-08-03 118 views
1

我有两个视图控制器:ViewControllerAViewControllerBViewControllerA被添加到一个容器视图,它有按钮。点击按钮时,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

+0

我们需要一些代码来帮助您 – pierreafranck

+0

试试这个,让我知道。 self.currentViewController = self.storyboard?.instantiateViewController(withIdentifier:“Verify”)as! VerifyViewController self.currentViewController.mainViewController = self –

+0

这部分内容不清楚self.currentViewController.mainViewController = self currentViewController没有mainViewController – kosas

回答

1

我挣扎有点理解你的代码。

如果需要维护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)语法!。显然除非是必要的。
相关问题