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

Posted

技术标签:

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

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

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

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

【问题讨论】:

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

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

【讨论】:

以上是关于在 iOS 的子视图控制器中调用方法的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController 的子视图中调用的旋转方法?

在 iOS 7 中重新计算旋转时的子视图大小

标签栏(视图控制器)中多次调用ios的通知中心方法方法?如何删除观察者?

在视图初始化之前调用视图控制器中的方法 - iPhone iOS 5 SDK

iOS 状态保存和容器视图

从 Facebook API iOS 的另一个视图控制器调用方法