在另一个视图中使用需要 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 非常有效 当然可以使用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 吗? 【参考方案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 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)是不可能的

以上是关于在另一个视图中使用需要 UITableView 的函数?的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 原型在同一视图控制器中的两个 UITableView 之间重用

xcode 在另一个下插入一个视图

动画 UITableView 宽度约束

iPhone SDK:使用新行插入和更新 UITableView

需要帮助创建复杂的 UIView - Swift xCode [关闭]

表视图的 headerView 中的 UITableView