在 iOS 中调用子视图控制器中的方法

Calling methods in child view controller in iOS

我有一个用 Swift 为 iOS 13 编写的应用程序,我在其中使用故事板以模态方式呈现视图。呈现新视图后,我希望父级调用位于子视图控制器内的方法(我的自定义 class 继承自 UIViewController)。

为此,我计划在我的父视图控制器中使用一个方法,使模态视图控制器作为其子视图呈现。一旦我得到这个引用,我将从我的父视图控制器调用子函数。

我意识到这可能是一个糟糕的设计决定,但我还没有找到避免这种方法的方法。我已经查看了整个 Whosebug 以找到答案,但我还没有找到任何答案。任何帮助将不胜感激。

通过 Segue

当可能通过按下按钮或 table 视图选择 prepare(for:) 方法触发 segue 时,将在您的视图控制器上调用,此时您可以通过设置来配置 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 并分配给 viewDidLoad() 方法中的相关 UILabel。

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

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

You can achieve same thing through closure and Delegates

您可以实例化子视图控制器并在呈现之前设置其属性。然后根据数据更改子视图控制器的代码放在 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
        }
    {
}

或者,您可以在代码中触发 segue,而不是直接显示子视图控制器。

在这种情况下,您可以在父视图控制器的重写 prepare(for:sender:) 方法中设置子视图控制器,其中可以使用 segue.destinationViewController.

访问子视图控制器