首页 > 解决方案 > 如何在 Swift 中的 UIViewController 和 NSObject 之间传递数据

问题描述

我有一个 viewController 和一个 NSObject 文件(称为 autoPDFBuilder)。我想将在 viewController(称为 infoViewController)中的变量中检索和存储的数据传递给 autoPDFBuilder 中的变量。如果我尝试使用 segue 发送信息,那么它不起作用,因为 autoPDFBuilder 不是 UIViewController。显然,如果我使用 segue 将数据发送到任何其他 UIViewController,那么它可以工作,但我需要将数据获取到 NSObject 文件,以便我可以使用数据创建 PDF 文件。这是segue代码:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

let client = clientTextField.text!
let claimNumber = claimNumberTextField.text!
let fileNumber = fileNumberTextField.text!
let lossDate = lossDateTextField.text!
let insured = insuredTextField.text!
let claimant = claimantTextField.text!
let picsBy = picsByTextField.text!
let dateTaken = dateTakenTextField.text!


let vc = segue.destination as! autoPDFBuilder
vc.client = client
vc.claimNumber = claimNumber
vc.fileNumber = fileNumber
vc.dateOfLoss = lossDate
vc.insured = insured
vc.claimant = claimant
vc.picsBy = picsBy
vc.dateTaken = dateTaken

}

如果我尝试使用 segue,则会出现以下错误......因为 autoPDFBuilder 是 NSObject 而不是 UIViewController:“从 'UIViewController' 转换为不相关类型 'autoPDFBuilder' 总是失败。

我还尝试首先获取数据,通过 infoViewController 中的 segue 将其发送到 claimTypeViewController(这工作正常......数据已传递)。然后,在 autoPDFBuilder 中,访问现在位于 claimTypeViewController 中的数据,如下所示:

class autoPDFBuilder: NSObject {

var client = String()
var claimNumber = String()
var fileNumber = String()
var dateOfLoss = String()
var insured = String()
var claimant = String()
var picsBy = String()
var dateTaken = String()

let vc = claimTypeViewController()
client = vc.client

}

这也不起作用。正如我之前提到的,数据已成功从 infoViewController 传递给 claimTypeViewController(因为它们都是 UIViewControllers),但是当我尝试从 autoPDFCreator 访问数据时,在 claimTypeViewControllers 中保存数据的变量完全为空。他们什么都没有。我在每一步之后都运行了打印测试,所以我知道问题出在哪里......这只是数据未在 NSObject 文件和 UIViewController 文件之间共享的问题。

我还尝试使用第三方 .swift 文件以上述相同样式(在第二个代码块中)发送数据,但这也不起作用。在名为 Variables 的第三方文件中,我创建了一个常量

let infoController = infoViewController()

然后创建一个变量来存储来自infoViewController的客户端变量

var theClient = String()

然后将检索数据放入变量中,如下所示:

theClient = infoController.client

然后在 autoPDFCreator 中执行相同的操作以从变量文件中检索数据。当然,这些都不起作用。我也尝试了许多其他方法 - 没有运气。

我做了很多研究,似乎无法弄清楚。类似的帖子只有一个,但问题的答案在用户的回复中没有明确说明。

请帮助我,使您的答案完整并带有插图……我通过视觉来学习。我是初学者,所以也请解释你的答案。

感谢您的好意和帮助!

标签: iosswiftuiviewcontrollertransfernsobject

解决方案


假设您当前已将 segue 连接到按钮水龙头...

  • 删除那个segue
  • 连接@IBAction到您的按钮点击
  • 在该操作中,实例化一个AutoPDFBuilder对象(旁注:对类名使用LeadingUpperCase,对变量使用LeadingLowerCase)

这些方面的东西:

@IBAction func buttonTapped(_ sender: UIButton) {
    
    let client = clientTextField.text!
    let claimNumber = claimNumberTextField.text!
    let fileNumber = fileNumberTextField.text!
    let lossDate = lossDateTextField.text!
    let insured = insuredTextField.text!
    let claimant = claimantTextField.text!
    let picsBy = picsByTextField.text!
    let dateTaken = dateTakenTextField.text!

    // instantiate a AutoPDFBuilder object
    let pdfBuilder = AutoPDFBuilder()
    pdfBuilder.client = client
    pdfBuilder.claimNumber = claimNumber
    pdfBuilder.fileNumber = fileNumber
    pdfBuilder.dateOfLoss = lossDate
    pdfBuilder.insured = insured
    pdfBuilder.claimant = claimant
    pdfBuilder.picsBy = picsBy
    pdfBuilder.dateTaken = dateTaken

    // call a function in the AutoPDFBuilder class
    pdfBuilder.createPDF()
    
}

class AutoPDFBuilder: NSObject {
    
    var client = String()
    var claimNumber = String()
    var fileNumber = String()
    var dateOfLoss = String()
    var insured = String()
    var claimant = String()
    var picsBy = String()
    var dateTaken = String()

    func createPDF() -> Void {
        // do what you do to bild the pdf
    }
    
}

推荐阅读