从子视图控制器推送视图控制器

Push View Controller From Child View Controller

我有一个应用程序,其中有一个 "DadViewController",其中包含一个启用了分页的 UIScrollView。每个页面都填充了不同的 UIViewController.

如何在 UIScrollView 中包含的其中一个控制器中通过点击按钮推送新的 UIViewController

class DadView: UIView {

    let model = DadModel()

    let scrollView: UIScrollView = {
        let view = UIScrollView()
        view.isPagingEnabled = true
        // Additional setup...
        return view
    }()



    override init(frame: CGRect) {
        super.init(frame: frame)
        setupScrollView()
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }



    fileprivate func setupScrollView() {
        self.addSubview(scrollView)
        // Autolayout code to pin scrollview to all 4 sides

        let vc1 = VC1()
        scrollView.addSubview(vc1.view)
        vc1.view.frame = CGRect(x: 0, y: 0, width: SCREEN_WIDTH, height: SCREEN_HEIGHT)

        // Add additional view controller views with the appropriate frames...

    }
}

class DadController: UIViewController {
    var dadView: DadView!

    override func loadView() {
        super.loadView()
        dadView = DadView()
        view = dadView
    }
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

class VC1: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .green
    }

}

更改您的 DadView setupScrollView 以接受 UIViewController 实例作为参数。并且不要在 init

中调用此方法
class DadView: UIView {

    let model = DadModel()

    let scrollView: UIScrollView = {
        let view = UIScrollView()
        view.isPagingEnabled = true
        // Additional setup...
        return view
    }()



    override init(frame: CGRect) {
        super.init(frame: frame)
//        setupScrollView()
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }



    fileprivate func setupScrollView(_ parentVC: UIViewController) {
        self.addSubview(scrollView)
        // Autolayout code to pin scrollview to all 4 sides

        let vc1 = VC1()
        vc1.view.frame = CGRect(x: 0, y: 0, width: SCREEN_WIDTH, height: SCREEN_HEIGHT)
        parentVC.addChild(vc1)
        scrollView.addSubview(vc1.view)
        vc1.didMove(toParent: parentVC)

        // Add additional view controller views with the appropriate frames...

    }
}

在 DadViewController 中创建 DadView 实例后调用 setupScrollView 方法与 self

class DadController: UIViewController {
    var dadView: DadView!

    override func loadView() {
        super.loadView()
        dadView = DadView()
        dadView.setupScrollView(self)
        view = dadView
    }
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

然后可以从子viewcontroller获取父视图控制器并执行推送

class VC1: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .green
    }
    @IBAction func buttonAction(_ sender: UIButton) {
        self.parent?.navigationController?.pushViewController(NewVC(), animated: true)
    }
}