在另一个视图中使用需要UITableView的函数?

时间:2018-03-21 09:43:18

标签: ios swift function uitableview core-data

在我的 WalletTableViewController 中,我有两个函数,用于计算Wallet Value

A. updateCellValue()reloadData()tableViewindexPath.rowvalueamount(价格)和对应于该单元格的func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! WalletTableViewCell cell.delegate = self cell.amountTextField.delegate = self updateCellValue(cell, atRow: indexPath.row) return cell } func updateCellValue(_ walletTableViewCell: WalletTableViewCell, atRow row: Int) { var newCryptos : [CryptosMO] = [] var doubleAmount = 0.0 if CoreDataHandler.fetchObject() != nil { newCryptos = CoreDataHandler.fetchObject()! } cryptoPrice = cryptos[row].code! guard let cryptoDoublePrice = CryptoInfo.cryptoPriceDic[cryptoPrice] else { return } let selectedAmount = newCryptos[row] guard let amount = selectedAmount.amount else { return } var currentAmountValue = selectedAmount.amountValue doubleAmount = Double(amount)! let calculation = cryptoDoublePrice * doubleAmount currentAmountValue = String(calculation) CoreDataHandler.editObject(editObject: selectedAmount, amount: amount, amountValue: currentAmountValue) updateWalletValue() } (硬币数量)并进行计算以获得该硬币的总值(amountValue = value * amount)。然后用Core Data保存。

updateWalletValue()

B。 amountValue是一个获取核心数据中所有Wallet Value个对象的函数,并将它们相加以计算func updateWalletValue() { var items : [CryptosMO] = [] if CoreDataHandler.fetchObject() != nil { items = CoreDataHandler.fetchObject()! } total = items.reduce(0.0, { $0 + Double($1.amountValue)! } ) WalletTableViewController.staticTotal = total }

MainViewController

在我的Wallet Value中,也会显示func updateMainVCWalletLabel() { //... what can I do here?? } ,但如何刷新它的值?

WalletViewController

这对TableView 当然适用于indexPathupdateCellValue,但如何从MainViewController调用WalletViewController MainViewController保持更新价值?

@IBAction func walletButtonTapped(_ sender: Any) { let walletViewController = self.storyboard?.instantiateViewController(withIdentifier: "walletTableViewController") self.present(walletViewController!, animated: true) } 被实例化并从Picasso

推送
OutOfMemoryException

2 个答案:

答案 0 :(得分:1)

如果要在多个视图控制器中使用单个方法,则应实现该方法,您可以从任何位置调用该方法。例如,你可以在这里使用单例类。

  1. 创建一个swift文件并根据需要命名(如WalletHelper或WalletManager)
  2. 然后您将获得具有以下格式的文件
  3.     class WalletHelper: NSObject
        {
    
        }
    
    1. 为该类创建共享实例
    2.     static let shared = WalletHelper()
      
      1. 实施您想要的方法
      2.     func getWalletValue() -> Float {
                // write your code to get wallet value`
               // and return the calculated value
            }
        
        1. 最后调用类似
        2. 的方法
              let walletValue = WalletHelper.shared. getWalletValue()
          

          WalletHelper.swift看起来像

          import UIKit
          
          class WalletHelper: NSObject
          {
              static let shared = WalletHelper()
          
              func getWalletValue() -> Float {
                  // write your code to get wallet value
                  // and return the calculated value
              }
          }
          

答案 1 :(得分:0)

更新(旧答案如下)

对我来说,绝对不清楚你想要达到的目标:你想要更新哪个值? staticTotal? 对我来说似乎像XYProblem一样。正如@vadian昨天评论的那样,请清楚地描述数据的存储位置,控制器的连接方式,以及为了实现目的而要更新的内容。您还可以提供MCVE,以明确您的要求,而不是添加越来越多的代码段。

而且,更有趣:当您在CoreDataHandler.editObject的调用堆栈中时,为什么修改 CoreData条目(tableView(_: cellForRowAt:))? 永远不会这样做!您正处于阅读案例中 - reloadData旨在更新表格视图,以反映数据后的数据更改改变。 旨在更新数据本身。 tableView(_: cellForRowAt:)被多次调用,特别是当用户向上和向下滚动时,因此当您写入数据库时​​,会导致大的写入影响(因此:性能损失)。

旧帖子

你可以在表格视图上调用reloadData,然后会更新它的单元格。

您的代码也存在一些问题:

  • 为什么经常拨打updateWalletValue()?每次显示一个单元格时,都会调用它,在整个数据库中运行并执行一些减少工作。您应该缓存该值,并且仅在数据本身被修改时才更新它
  • 为什么要拨打fetchObject()两次(updateWalletValue())?

你应该这样做:

func updateWalletValue() {

    guard let items:[CryptosMO] = CoreDataHandler.fetchObject() else {
        WalletTableViewController.staticTotal = 0.0
        return
    }

    total = items.reduce(0.0, { $0 + Double($1.amountValue)! } )

    WalletTableViewController.staticTotal = total
}