在我的 WalletTableViewController
中,我有两个函数,用于计算Wallet Value
:
A. updateCellValue()
由reloadData()
跟tableView
跟indexPath.row
跟value
取amount
(价格)和对应于该单元格的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
当然适用于indexPath
和updateCellValue
,但如何从MainViewController
调用WalletViewController
MainViewController
保持更新价值?
@IBAction func walletButtonTapped(_ sender: Any) {
let walletViewController = self.storyboard?.instantiateViewController(withIdentifier: "walletTableViewController")
self.present(walletViewController!, animated: true)
}
被实例化并从Picasso
OutOfMemoryException
答案 0 :(得分:1)
如果要在多个视图控制器中使用单个方法,则应实现该方法,您可以从任何位置调用该方法。例如,你可以在这里使用单例类。
class WalletHelper: NSObject
{
}
static let shared = WalletHelper()
func getWalletValue() -> Float {
// write your code to get wallet value`
// and return the calculated value
}
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
}