【问题标题】:Use a function that needs UITableView in another view?在另一个视图中使用需要 UITableView 的函数?
【发布时间】:2018-03-21 09:43:18
【问题描述】:

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

A. updateCellValue()reloadData() 调用,带有tableView 并使用indexPath.row 获取value(价格)和amount(硬币数量)对应于单元格并进行计算以获得该硬币的总价值(amountValue = value * amount)。然后将其与 Core Data 一起保存。

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()
}

B. updateWalletValue() 是一个函数,它获取 Core Data 中的所有 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 非常有效 当然可以使用TableViewindexPath,但是我怎样才能从MainViewController 调用updateCellValue 以保持价值更新了吗?

WalletViewController 被实例化并从MainViewController 推送:

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

【问题讨论】:

  • 您可以为此使用Notification。观察您想要更新值的通知,并在数据发生更改时触发它。
  • 请勿转发问题。改进你的问题。例如添加两个视图控制器如何相关的信息
  • @vadian 这是我昨天想问的,但似乎没有人明白,我认为我的问题太糟糕了,我会问一个新的
  • @TheTiger 我更精确地更新了我的问题
  • @martin 是的!你试过Notification 吗?

标签: ios swift function uitableview core-data


【解决方案1】:

如果您想在多个视图控制器中使用单个方法,您应该实现该方法,您可以从任何地方调用该方法。例如,您可以在此处使用单例类。

  1. 创建一个 swift 文件并根据需要命名(如 WalletHelper 或 WalletManager)
  2. 然后你会得到一个如下格式的文件
    class WalletHelper: NSObject
    {

    }
  1. 为该类创建一个共享实例
    static let shared = WalletHelper()
  1. 实现你想要的方法
    func getWalletValue() -> Float {
        // write your code to get wallet value`
       // and return the calculated value
    }
  1. 最后像这样调用那个方法
    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
    }
}

【讨论】:

  • 这是否允许我在位于另一个view controllertableView 上调用reloadData()
【解决方案2】:

更新(下面的旧答案)

对我来说,你想要实现什么完全不清楚:你想要更新哪个值? staticTotal? 对我来说似乎有点像XYProblem。正如@vadian 昨天评论的那样,请清楚地描述数据存储在哪里,控制器是如何连接的,你想在什么时候更新什么以实现什么。您还可以提供一个MCVE 来明确您的要求,而不是添加越来越多的代码 sn-ps。

而且,更有趣的是:当您在 tableView(_: cellForRowAt:) 的调用堆栈中时,为什么要修改 CoreData 条目 (CoreDataHandler.editObject)? 永远不会这样做!您处于正在阅读的情况 - 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
}

【讨论】:

  • 嗨 Andreas,从 MainViewController 调用 reloadData 崩溃,这是有道理的,因为 tableView 未显示。
  • 如果没有显示,为什么要更新单元格(也没有显示)?请更准确地说明您想要更新的内容。
  • 我试图更好地编辑问题,我需要更新total FROM MainViewController,而现在使用updateCellValue(cell, atRow: indexPath.row)是不可能的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
相关资源
最近更新 更多