【问题标题】:Calling methods in child view controller in iOS在 iOS 的子视图控制器中调用方法
【发布时间】:2020-01-14 08:59:12
【问题描述】:

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

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

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

【问题讨论】:

  • 你能不能不实例化子视图控制器,设置它的一个属性(可能是一个布尔标志)然后呈现它,并在子视图的viewDidLoad()方法中使用该属性?
  • 感谢@Chris,这是我作为一个新的 iOS 开发人员没有想到的一种方法,它是比我更好的设计选择。如果您将此作为完整答案发布,我将很乐意接受。
  • 谢谢。当我在我的电脑上时,我会发布一个答案。您是否在代码中使用 segues 或实例化没有故事板视图控制器?两者都可以。
  • 使用 segues - 我觉得这样更容易。
  • 我已经发布了我的答案,没有转义 - 需要提醒自己如何使用它们。基本上它是调用performSegue() 并在覆盖的prepareFor(segue:) 方法上进行设置。

标签: ios swift xcode uiviewcontroller


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    通过转场

    当 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 并分配给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 ?? “”)”
    }
    

    你可以通过闭包和委托实现同样的事情

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多