如何计算从 xcode tableView 中选择的值

Posted

技术标签:

【中文标题】如何计算从 xcode tableView 中选择的值【英文标题】:How to calculate values that are selected from xcode tableView 【发布时间】:2020-06-10 09:48:49 【问题描述】:

我想做一些类似购物的事情,每当用户从 UITableView 中选择一个单元格时,该项目的价格将显示在总标签中,当他选择另一个项目时,两个项目的总和将显示在总标签中.我做了一个 plist 并将物品存放在那里。我现在要做的是如何将价格值分配给项目,当用户选择一个单元格“项目”时,将显示价格。这是我到目前为止所做的。请帮我。

这是视图控制器:

(https://imgur.com/sQnz1YY)

import UIKit

class ServiceListViewController: UIViewController,UITableViewDelegate, UITableViewDataSource 

    @IBOutlet weak var tablelbl: UITableView!

    var SerArr :[ServiceOB] = []
    var ArrService: [String] = []

    override func viewDidLoad() 
        super.viewDidLoad()

        tablelbl.delegate = self
        tablelbl.dataSource = self

        let path = Bundle.main.path(forResource: "ServiceList", ofType: "plist")

        let serArray : NSArray = NSArray(contentsOfFile: path!)!
        for service in serArray 
            print(service)
            let serviceOBJ = ServiceOB()

            // i change your plist to array


            serviceOBJ.Service = service as! String
            // check now..
            SerArr.append(serviceOBJ)
        
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return SerArr.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tablelbl.dequeueReusableCell(withIdentifier: "ServiceListCell") as! ServiceTableViewCell
        let obj = SerArr[indexPath.row]
        cell.servicelbl.text! = obj.Service

        return cell
    

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        if tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCell.AccessoryType.checkmark

            tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.none        
        else 
            tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.checkmark

        
    

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
        return 100.0
    


【问题讨论】:

您选择单元格的方式无论如何都行不通。单元格被重用,当用户滚动时你会得到意想不到的行为。您必须将所选状态保存在模型中并将其设置在cellForRowAt 使用单元类的委托将价格值添加到总标签中 不知道为什么这被标记为 Firebase - 没有 Firebase 代码。也不清楚问题是什么 - 如果您的 dataSource 数组包含所有项目信息,当客户选择一个项目时,只需在数组中存储一个带有该对象的“已选择”标志,并且在显示单元格时,如果该标志它设置,还显示价格。您的总数将是它设置的标志的所有单元格的总数。你能澄清一下困难在哪里吗? 【参考方案1】:

创建tablecell的委托,并通过点击tablecell中的按钮调用委托方法。

protocol tableCellDelegate 
   func callMethod()


class tableCell: UITableViewCell
var delegate: tableCellDelegate?

@IBAction func selecteItem(_ sender: Any) 
  delegate?.callMethod()


class VC: UIViewController
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> 
UITableViewCell 
  let cell = .....
  cell.delegate = self
  return cell


func callMethod()
  // Do some thing


【讨论】:

【参考方案2】:

这很容易。只需使用使用的原始单元格类型获取表格单元格并保留一个变量来存储总价的值:

@IBOutlet weak var priceLabel: UILabel!

var price: Double = 0.0 
    didSet 
        // You can use localisation to change the currency. But that is currently not a part of the problem statement.
        priceLabel?.text = "$\(price)"
    


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    if let cell = tableView.cellForRow(at: indexPath) as? ServiceTableViewCell 
        // Assuming cell has a property for storing price: itemPrice
        if cell.accessoryType == .checkmark 
            totalPrice -= cell.itemPrice
            cell.accessoryType = .none
         else 
            totalPrice += cell.itemPrice
            cell.accessoryType = .checkmark
        
    

注意:您不需要 plist 文件来存储选定的值。但是,如果您出于此处未提及的其他一些原因需要它,您也可以根据选择更改 plist 的内容。

【讨论】:

以上是关于如何计算从 xcode tableView 中选择的值的主要内容,如果未能解决你的问题,请参考以下文章

iOS xcode重用tableview [关闭]

从 tableview 中选择时在多个详细视图之间切换

Xcode UI 测试 - UITableView 部分

从选定的 TableView Cell Swift Xcode 传递 var

如何在 Swift Xcode 6.4 的 TableView 中显示 Parse 数组

在 xcode 中使用 tableview 创建注册表单(如 SnapChat)