通过另一个 ViewController 从一个 ViewController 获取数据

Posted

技术标签:

【中文标题】通过另一个 ViewController 从一个 ViewController 获取数据【英文标题】:Get data from a ViewController via another ViewController 【发布时间】:2018-07-17 13:57:42 【问题描述】:

我有一个应用程序,其中有三个ViewControllers 和一个tableView。它们都是分层的,俱乐部 -> 会员 -> 交易。在memberVC 中,所有俱乐部的成员都显示了他们的名字和saldo。那里的saldo是根据起始金额和所有交易的金额计算的。现在我想在俱乐部展示,整个俱乐部的saldo,由所有会员的起始金额和俱乐部会员的所有交易金额计算得出。我试过了,但我的解决方案在(member?.transactions)! 部分抛出了这个错误:

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).

这是我的解决方案:

  var transcount = 0.0
        for trans in (member?.transactions)!
            transcount = trans.money + transcount
       

        var countmember = 0.0
        for membs in (club.members)! 
            countmember = membs.saldo + countmember
        

这就是成员的创建方式:

  let member = Member(name: nameTextField.text ?? "", saldo: Double(saldoTextField.text!) ?? 0.0, surname: firstnameTextField.text ?? "")

        do
            try member?.managedObjectContext?.save()
         catch 
            print("Could not save member")
        
        let name = nameTextField?.text
        let surname = firstnameTextField?.text
        let saldoText = saldoTextField?.text ?? ""
        let saldo = Double(saldoText) ?? 0.0

        if let member = Member(name: name, saldo: saldo, surname: surname) 
          club?.addToRawMembers(member)

            do 
                try member.managedObjectContext?.save()

                self.navigationController?.popViewController(animated: true)
             catch 
                print ("Member couldn't be created")
           
        
    

这是创建交易的方式:

   let transaction = Trancsaction(money: Double(moneyTextField.text!) ?? 0.0, date: datePicker.date , reason: reasonTextField.text ?? "")
        do
            try transaction?.managedObjectContext?.save()

         catch
            print("Could not save transaction")
        

        let reason = reasonTextField?.text
        let moneyText = moneyTextField?.text ?? ""
        let money = Double(moneyText) ?? 0.00
        let date = datePicker?.date

        if let transaction = Trancsaction(money: money, date: date, reason: reason)   
           member?.addToRawTransactions(transaction)

            do
                try transaction.managedObjectContext?.save()

                self.navigationController?.popViewController(animated: true)
             catch
                print("Transaction could not be created")
            
        

    

【问题讨论】:

首先,为了您自己的理智,请确保不要强制解包您的变量,因为如果您知道天气成员是否实际存在,调试代码会容易得多。您现在的错误可能就是这种情况。 - 其次,确保您的数据模型在您进入第一个视图控制器时具有所需的所有详细信息,因为我假设您不想浏览所有三个页面然后返回显示交易的计算值? @lindanordstrom 你是什么意思?我必须创建一个新的核心数据模型吗? @lindanordstrom 到强制展开的部分。谢谢你的提示,我是编程新手,所以我很感激各种帮助。我这样做是因为 xCode 建议这样做。 好吧,如果我错了,请纠正我,但据我了解,您的应用程序有三页,在第二页和第三页上进行各种计算,对吧?这意味着,当您第一次启动应用程序并进入第一页时,您想要的计算还没有发生,因为您在第二页和第三页进行了计算?所以我的意思是确保在应用启动时为每个俱乐部、会员和交易计算一切,然后当你输入它们时,你可以在每个屏幕上用正确的数据填充 UI。但我可能无法正确理解您的问题 是的,我认为您理解正确。在第二页有一个tableView 与俱乐部的所有成员。有一个带有名称标签和详细标签的单元格,其中所有交易的计数(从第三页开始)加上成员的起始金额。这个计算有效。现在我想将俱乐部的所有这些详细标签的总和添加到俱乐部单元格的详细标签中。 【参考方案1】:

你在没有充分理由的情况下强制解包一个可选项——永远不要这样做。 membertransactions 很可能是 nil。因此,使用此模式将您的代码转换为安全代码:

var transcount = 0.0
if let transactions = member?.transactions 
    for trans in transactions 
        transcount = trans.money + transcount
    

【讨论】:

我这样做了。现在没有错误了,但代码仍然不能像我想要的那样工作。只有会员的起始金额,但没有整个俱乐部的交易。 请添加更多代码,以便我们了解您如何填写您的会员和交易数据结构。目前他们似乎是nil 我将其添加到问题中 您不会碰巧将Member 声明为struct 不,我没有将其声明为struct

以上是关于通过另一个 ViewController 从一个 ViewController 获取数据的主要内容,如果未能解决你的问题,请参考以下文章

通过 UINavigationController 将整个 UIView 从一个 ViewController 传递到另一个

UIImage 没有从一个 ViewController 传递到另一个

无法使用 mapKit 从 ViewController 将坐标发送到具有委托的另一个 viewController

将文本从Textfield传递到另一个ViewController

从 UIScrollview UIView SubView 推送到另一个 ViewController

使用 UIView 中的按钮从另一个 ViewController 触发方法