Как получить доступ к функции ParentViewController - PullRequest
0 голосов
/ 22 февраля 2019

Я переключаюсь на ChildViewController с помощью функции goChildViewController в родительском представлении.

class ParentViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func goChildViewController() {
        DispatchQueue.main.async {
            self.navigationController?.view.layer.add(CATransition().popFromRight(), forKey: nil)
            self.navigationController?.pushViewController(ChildViewController(), animated: false)
        }
    }

    func needToAccessThisFunction() {
        // I need to call this function from ChildViewController
    }

}

Я хочу получить доступ к функции "needToAccessThisFunction" из ChildViewController.

class ChildViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        //ParentViewController.needToAccessThisFunction()
    }

}

Как я могу это сделатьчто?

Ответы [ 4 ]

0 голосов
/ 22 февраля 2019

Существует несколько решений для вызова родительского элемента из дочернего контроллера представления.

Одним из них является использование delegate (что я настоятельно рекомендую) и ЗДЕСЬ - простой пример для этого.

И есть еще один способ, которым вы можете напрямую вызвать parent, добавив приведенный ниже код в дочерний контроллер представления.

@IBAction func btnTapped(_ sender: Any) {
    if let parent = self.parent as? ViewController { //ViewController is a parent view controller here.
        parent.methodFromChild()
    }
}

и в ViewController вам необходимо объявить

func methodFromChild() {
    print("call from child")
}
0 голосов
/ 22 февраля 2019
Declare protocol to your child controller like this
protocol ChildControllerDeledate: class {
   func callParentFunction()
} 

Then Implement the child protocol in Parent controller 

Extension ParentController: ChildControllerDeledate {

   func callParentFunction() {
     //Call your parent function/method from here
   }

}
0 голосов
/ 22 февраля 2019

Для этого вы можете использовать делегатов: -

     protocol requiredMethods: class {
           func a()
           func b()
        }

        class FirstVC: UIViewController, requiredMethods {
            func a() {}
            func b() {}


        func goChildViewController() {
                DispatchQueue.main.async {

        let vc = SecondVC()
               vc.delegate = self
               self.navigationController?.view.layer.add(CATransition().popFromRight(), forKey: nil)
                    self.navigationController?.pushViewController(vc, animated: false)
                }
            }

        }

        class SecondVC: UIViewController {
            weak var delegate: requiredMethods?

            // to  call method a() self.delegate?.a())
            // to  call method b() self.delegate?.b())

        }
0 голосов
/ 22 февраля 2019

Вы можете сделать это, но это не очень хорошая идея.

Ваш ChildViewController теперь находится в стеке навигации, поэтому вы можете вызвать родительскую функцию примерно так:

class ChildViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        if let parent = self.navigationController?.viewControllers[0] as? ParentViewController {
            parent.needToAccessThisFunction()
        }
    }
}

Предполагается, что ParentViewController находится внизу стека (элемент [0]).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...