在 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
.
访问子视图控制器
我有一个用 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
.