Swift 如何在 UIViewController 和 NSObject 之间传递数据

How to pass data between a UIViewController and an NSObject in Swift

我有一个 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:“Cast from '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(因为它们都是 UIViewController),但是当我尝试从 autoPDFCreator 访问数据时,在 claimTypeViewController 中保存数据的变量完全是空的。他们什么都没有。我 运行 在每一步后都打印测试,所以我知道问题出在哪里...这只是数据不在 NSObject 文件和 UIViewController 文件之间共享的问题。

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

let infoController = infoViewController()

然后创建一个变量来存储来自 infoViewController

client 变量
var theClient = String()

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

theClient = infoController.client

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

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

请帮帮我,让你的答案完整且有插图……我通过视觉观察来学习。我是初学者,所以也请解释你的答案。

感谢您的好意与帮助!

假设您当前已将 segue 连接到按钮点击...

  • 删除那个 segue
  • @IBAction 连接到您的按钮水龙头
  • 在该操作中,实例化一个 AutoPDFBuilder 对象(旁注:class 名称使用 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
    }
    
}