使用 segue 的参数调用函数

Posted

技术标签:

【中文标题】使用 segue 的参数调用函数【英文标题】:Calling function with argument from segue 【发布时间】:2017-11-21 22:19:25 【问题描述】:

我有一个带有表格视图的 FirstVC,它与另一个 SecondVC 相连,我在其中传递了按下单元格的名称。在 SecondVC 中,我有另一个要填充数据的 tableview。我有一个名为 gettingUrls() 的函数,它正在为我的表格视图提取数据:

DataService.instance.mainRef.child("Folders").child("\(folderName)").observeSingleEvent(of: .value)  (snapshot: DataSnapshot) in...

其中“文件夹名称”是来自 FirstVC 的值。此功能实现为“拉动刷新功能”,效果很好。但是,当我尝试在 viewDidLoad 中运行该函数本身时,由于文件夹名称为空,它会不断使应用程序崩溃。我只是不明白为什么此时来自 segue 的值在刷新函数中可用,而不在 viewDidLoad 中。

这是segue的代码:

let detailVC = self.storyboard?.instantiateViewController(withIdentifier: "DetailVC") as! DetailVC
        self.navigationController?.pushViewController(detailVC, animated: true)
        self.present(detailVC, animated: true, completion: nil)
        detailVC.folderName = fileName 

如何在 viewDidLoad 中运行函数?

【问题讨论】:

【参考方案1】:

在设置folderName 属性之前,您正在呈现DetailVC 的视图。视图已加载,但还没有folderName,因此程序崩溃。您应该在呈现DetailVC 之前放置detailVC.folderName = fileName 行。

您也不需要第 2 行和第 3 行 - 要么呈现新的视图控制器,要么将其推送到导航堆栈,而不是两者。

【讨论】:

在 DetailVC 显示之前我可以通过什么方式放置它?我敢打赌这个问题很愚蠢,但我是 swift 新手。 放在self.navigationController?.pushViewController(detailVC, animated: true)之前。那是显示 DetailVC 的行。 哇,原来这么简单!非常感谢:) 没问题!既然它解决了你的问题,你能接受这个答案作为解决方案吗?【参考方案2】:

您应该使用 segues 编写代码来推送视图控制器,例如不使用navigationController

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if (segue.identifier == "Verification") 
            let vc = segue.destination as! MyViewController
            vc.delegate = self
            vc.property = value
        

    

【讨论】:

感谢您的提示!然而,最重要的部分仍未得到解答。 ` vc.delegate = self ` 会做到的【参考方案3】:

所以在@haarismuneer 的帮助下,在初始化 SecondVC 之前传递变量就足够了:

detailVC.folderName = fileName
self.navigationController?.pushViewController(detailVC, animated: true)

【讨论】:

以上是关于使用 segue 的参数调用函数的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式展开 segue

swift函数中参数名称的间距

使用辅助函数从另一个类执行 Segue

segueing时出现核心数据错误:无法在NSManagedObject类上调用指定的初始值设定项

为 UIButton 调用发送方的方法

Swift 3 - 调用准备 segue 时视图不更新