在另一个视图中使用需要 UITableView 的函数?
Posted
技术标签:
【中文标题】在另一个视图中使用需要 UITableView 的函数?【英文标题】:Use a function that needs UITableView in another view? 【发布时间】: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
非常有效 当然可以使用TableView
和indexPath
,但是我怎样才能从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
吗?
【参考方案1】:
如果您想在多个视图控制器中使用单个方法,您应该实现该方法,您可以从任何地方调用该方法。例如,您可以在此处使用单例类。
-
创建一个 swift 文件并根据需要命名(如 WalletHelper 或 WalletManager)
然后你会得到一个如下格式的文件
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
【讨论】:
这是否允许我在位于另一个view controller
的tableView
上调用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)
是不可能的以上是关于在另一个视图中使用需要 UITableView 的函数?的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewCell 原型在同一视图控制器中的两个 UITableView 之间重用
iPhone SDK:使用新行插入和更新 UITableView