【问题标题】:Switching from one view controller to another in the same container view在同一个容器视图中从一个视图控制器切换到另一个视图控制器
【发布时间】:2017-08-03 07:16:20
【问题描述】:

我有两个视图控制器: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 抛出以下错误:

致命错误:在展开可选值时意外发现 nil

【问题讨论】:

  • 我们需要一些代码来帮助你
  • 试试这个并告诉我。 self.currentViewController = self.storyboard?.instantiateViewController(withIdentifier: "Verify") as!验证视图控制器 self.currentViewController.mainViewController = self
  • 这部分不清楚 self.currentViewController.mainViewController = self currentViewController 没有mainViewController
  • 将我在评论中给出的代码行添加到 ViewController 类的 viewDidLoad 中。

标签: ios swift uiviewcontroller


【解决方案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)语法而不是!。显然,除非是必要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 2015-03-23
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多