如何计算从 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 中选择的值的主要内容,如果未能解决你的问题,请参考以下文章
从选定的 TableView Cell Swift Xcode 传递 var