Push View Controller из дочернего представления контроллера - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть приложение, в котором есть «DadViewController», который содержит UIScrollView с включенной подкачкой.Каждая страница заполнена различным UIViewController.

Как мне нажать новый UIViewController нажатием кнопки в одном из контроллеров, содержащихся в UIScrollView?

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
    }

}

1 Ответ

0 голосов
/ 09 апреля 2019

Измените ваш 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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...