Вызов методов в дочернем контроллере представления в iOS - PullRequest
0 голосов
/ 14 января 2020

У меня есть приложение, написанное на Swift для iOS 13, где я представляю представление модально, используя раскадровки. После представления нового представления я хочу, чтобы родитель вызвал метод, который находится внутри дочернего контроллера представления (моего пользовательского класса, который наследуется от UIViewController).

Для этого я планирую есть метод внутри моего родительского контроллера представления, который получает модальный контроллер представления, представленный как его дочерний элемент. Как только я получу эту ссылку, я вызову дочернюю функцию из моего родительского контроллера представления.

Я понимаю, что это, вероятно, плохое проектное решение, но я не нашел способа избежать такого подхода. Я просмотрел весь стекопоток, чтобы найти ответ, но пока не нашел. Любая помощь будет высоко ценится.

Ответы [ 2 ]

2 голосов
/ 14 января 2020

Through Segue

Когда segue запускается, возможно, нажатием кнопки или выбором вида таблицы prepare(for:) метод будет вызываться на вашем контроллере представления, на этом этапе вы можете настроить DestinationViewController, установив некоторые свойства.

RootViewController.Swift
    @IBOutlet weak var textFieldFirstName: UITextField!
    @IBOutlet weak var labelFullname: UILabel!
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let firstVC = segue.destination as? FirstViewController else { return }
    firstVC.firstname = textFieldFirstName.text

}

После ввода firstname и нажатия кнопки ввода значение firstname передается firstViewController и присваивается связанной UILabel в методе viewDidLoad().

FirstViewController.Swift
@IBOutlet weak var textFieldLastName: UITextField!
@IBOutlet weak var labelFirstName: UILabel!

var firstname: String?
override func viewDidLoad() {
super.viewDidLoad()
labelFirstName.text = “Firstname: \(firstname ?? “”)”
}

Вы можете достичь того же самого путем закрытия и делегатов

1 голос
/ 14 января 2020

Вы можете создать экземпляр дочернего контроллера представления и установить его свойства перед его представлением. Затем код, который изменяет дочерний контроллер представления на основе данных, помещается в метод viewDidLoad().

class ParentViewController: UIViewController {
    func goToChildViewController(object: CustomObject) {
        guard let childViewController = self.storyboard?.instantiateViewController(withIdentifier: "child") as? ChildViewController else { fatalError("Cannot instantiate child view controller!") }
        childViewController.myProperty = true
        childViewController.myObject = myObject // Example of how to pass data from a data model
        self.present(childViewController, animated: true)
    }
}

class ChildViewController: UIViewController {
    var myProperty = false
    var myObject: CustomObject? = nil

    override viewDidLoad() {
        if myProperty {
            // Conditional code here
        }
    {
}

Кроме того, вы можете вызвать переход в коде вместо непосредственного представления дочернего контроллера представления.

В этом случае вы должны настроить дочерний контроллер представления в переопределенном методе prepare(for:sender:) родительского контроллера представления, где к дочернему контроллеру доступа можно получить доступ, используя segue.destinationViewController.

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