在 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的通知中心方法方法?如何删除观察者?