【问题标题】:How to pass data between a UIViewController and an NSObject in Swift如何在 Swift 中的 UIViewController 和 NSObject 之间传递数据
【发布时间】:2020-10-23 07:52:44
【问题描述】:

我有一个 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

中的 client 变量
var theClient = String()

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

theClient = infoController.client

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

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

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

感谢您的好意和帮助!

【问题讨论】:

    标签: ios swift uiviewcontroller transfer nsobject


    【解决方案1】:

    假设您当前已将 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
        }
        
    }
    

    【讨论】:

    • 我明白你在做什么,感谢关于骆驼肠衣的提示。但我有个问题。在我浏览完剩下的四个视图控制器并在这些控制器中收集各种信息之后,我不想在应用程序的最后创建 PDF。是否会调用 AutoPDFBuilder 的函数,例如 createPDF() [像你一样],会导致 PDF 立即生成?
    • @CJAnimations - 我假设您有创建 PDF 的代码,所以是的,我们的想法是编写一个 createPDF() 函数来做到这一点。至于从应用程序的多个区域(多个视图控制器)跟踪信息,那是一个完全不同的问题。我不知道这是否是一次性的事情,或者您是否在本地保存数据,或者用户是否将连接到远程数据库,或者,或者,或者......如果这回答了你关于“将数据传递给 NSObject 子类,”将其标记为已接受并发布有关新主题的新问题。
    • 快速问题.. 在 AutoPDFBuilder() 中调用一个函数是否会锁定刚刚传递的信息,以便在我通过剩余的视图控制器时它不会被删除,或者它不会在那一刻除了创建 PDF 之外什么都不做?
    • 另外,这也没用。数据没有被传递。
    • @CJAnimations - 是的,数据 IS 正在传递到对象中。听起来您在浏览应用程序时没有设法保留对象。正如我所说,“...跟踪来自应用程序的多个区域(多个视图控制器)的信息,嗯,这是一个完全不同的问题”。搜索swift share data with multiple classes 并阅读。您可以使用 singletondata manager 类、Core Data 或各种其他方法,具体取决于最适合您的应用的方法。不过,所有这些都超出了 this 问题的范围。
    猜你喜欢
    • 1970-01-01
    • 2014-05-22
    • 2016-01-22
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    相关资源
    最近更新 更多