在 swift 4 中将数据解析为 vc 始终为零

Posted

技术标签:

【中文标题】在 swift 4 中将数据解析为 vc 始终为零【英文标题】:parse data to vc in swift 4 always nil 【发布时间】:2018-06-25 11:07:54 【问题描述】:

我想将数据从一个 VC 解析到另一个 VC,以打开一个带有给定数据作为 URL 字符串的 web 视图。数据来自表格视图。在表格视图中,我有一个带有打开 segue 功能的按钮。

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath, object: PFObject?) -> PFArchivTableViewCell? 


    let cell = tableView.dequeueReusableCell(withIdentifier: "PFCell") as! PFArchivTableViewCell?

    cell?.button.addTarget(self, action: #selector(someAction), for: UIControlEvents.touchUpInside)
    cell?.button.accessibilityHint = object?.object(forKey: "calameoURL") as? String return cell

然后我为按钮使用一个函数:

 @objc func someAction(sender: UIButton) 
    let PFurlString = sender.accessibilityHint!
    print ("URL in the cell: \(PFurlString)")
    self.performSegue(withIdentifier: "showPFArchivUrl", sender: AnyObject.self)


以及为转场做准备:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "showPFArchivUrl" 
    let destination = segue.destination as? ArchivWebViewController
    print ("button pressed")
    destination?.dataFromFirst = "Hello World"
    destination?.PFurlString? = PFurlString!

    


问题是:ArchivWebViewController中传递的字符串“Hello World”可用,但给定的变量“PFurlString”始终为零。有没有人想在另一个视图控制器上获取这个变量?

非常感谢您的回答。我更改了以下几行:

let cell = tableView.dequeueReusableCell(withIdentifier: "PFCell") as! PFArchivTableViewCell
cell.button.addTarget(self, action: #selector(someAction), for: UIControlEvents.touchUpInside)
    cell.button.accessibilityHint = object?.object(forKey: "calameoURL") as? String

在按钮的函数中,我在打印语句中获得了 accessibilityHint 的值。

但在 prepare(for segue: UIStoryboardSegue, sender: Any?) 中,值始终为 nil

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "showPFArchivUrl" 
    let destination = segue.destination as! ArchivWebViewController
print ("URL: \(PFurlString)")
        destination.PFurlString = PFurlString

    

【问题讨论】:

您使用了太多的感叹号和问号。例如语法as! PFArchivTableViewCell?(强制向下转换一个可选项到一个可选项)是没有意义的。删除?。建议强制解包在运行时不能失败的可选项,因为它们会发现设计错误。使用可选的向下转换没有任何反应,您也不知道为什么。强制解包目标视图控制器:let destination = segue.destination as! ArchivWebViewController。如果发生崩溃,则说明 segue 有问题。 【参考方案1】:

您正在 @objc func someAction(sender: UIButton) 中创建本地 PFurlString。 IDK,您在其中获得 PFurlString 但尝试替换

    let PFurlString = sender.accessibilityHint!

    PFurlString = sender.accessibilityHint!

确保您有一个类似 var PFurlString : String?

的类变量

【讨论】:

【参考方案2】:

您可以使用一个变量创建一个类,在其中保存 URL 的数据。在你展示了新的视图控制器之后,你可以在其中调用这个类并获取变量的值,结果是 url

【讨论】:

以上是关于在 swift 4 中将数据解析为 vc 始终为零的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 segue 的情况下在 Swift 3 中将数据从 VC 传递到另一个?

使用 ObjectMapper 和 Alamofire 时对象始终为零

如何在 Swift 中将 Firestore FieldValue 解析为日期

如何在函数中指定参数在 Swift 中可以为零

解析后JSON结果为零

选项的保护语句在 swift 中为零