ios - 如何在 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 中执行相同的操作以从变量文件中检索数据。当然,这些都不起作用。我也尝试了许多其他方法 - 没有运气。
我做了很多研究,似乎无法弄清楚。类似的帖子只有一个,但问题的答案在用户的回复中没有明确说明。
请帮助我,使您的答案完整并带有插图……我通过视觉来学习。我是初学者,所以也请解释你的答案。
感谢您的好意和帮助!
解决方案
假设您当前已将 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
}
}
推荐阅读
- linux - 如何使用更少的代码将文件列表传递给 bash 脚本
- node.js - QR Scanner npm 库为 chrome 抛出错误
- python-3.x - 仅计算匹配字符串的平均值
- graphql - 在查询列表时订阅列表以捕获所有项目?
- c++ - C ++在嵌套映射中初始化unique_ptr,编译错误?
- odoo - 如何让客户在创建时将第一封电子邮件发送到服务台
- apache - 停止 wsubdomain 上的 https 端口
- php - 发送数据按钮在 PHP 上不起作用
- wpf - WPF:鼠标悬停时使卡片更大一点
- flutter - linux机器上flutter中的打印错误