我在视图控制器中有一个表视图,我想要实现的结果是,如果选择了行,则为行1 ... 4添加5 var mytotal
;如果取消选择行,则减去5。
对于第5行(最后一行),如果选择了行,我想添加10,如果取消选择行,则减去10。 每次选择一行时,都会在单元格的右侧添加一个复选标记,当取消选择该行时,将删除复选标记。
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var mytotal: UILabel!
var total = 0
@IBOutlet weak var tableView: UITableView!
var items = ["Inside Cabinets", "Inside Fridge", "Inside Oven", "Interior windows","Laundry wash & dry"]
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "myCell")
}
// number of rows in table
func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
return self.items.count
}
// create the cells
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
var cell = self.tableView.dequeueReusableCellWithIdentifier("myCell")!
cell.textLabel!.text = self.items[indexPath.row]
cell.accessoryType = UITableViewCellAccessoryType.None
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
var theCell = tableView.cellForRowAtIndexPath(indexPath)!
if theCell.accessoryType == .None {
theCell.accessoryType = .Checkmark
total += 5
self.mytotal.text = String(total)
}
else if theCell.accessoryType == .Checkmark {
theCell.accessoryType = .None
total -= 5
self.mytotal.text = String(total)
}
}
}
答案 0 :(得分:0)
我对您的代码进行了一些更改,以实现您所描述的内容。
首先,您可以创建一个结构并为每个元素存储数据,而不是只有一个String
项数组。
struct Item {
var name: String // Name of the row (e.g. "Inside cabinets")
var isSelected: Bool // Whether or now this item has been selected
var value: Int // How much you increase your total when selecting this row
}
然后在视图控制器中,您将按如下方式定义[Item]
数组:
var items = [
Item(name: "Inside Cabinets", isSelected: false, value: 5),
Item(name: "Inside Fridge", isSelected: false, value: 5),
Item(name: "Inside Oven", isSelected: false, value: 5),
Item(name: "Interior windows", isSelected: false, value: 5),
Item(name: "Laundry wash & dry", isSelected: false, value: 10)
]
当您的tableView:cellForRowAtIndexPath
方法中的单元格出列时,如果您的项目列表变得足够长,则您将出列的单元格将被重复使用。因此,在检查和取消选中单元格时需要小心。单元格滚动离开屏幕后,您将失去其已选中/未选中状态。此外,由于重复使用单元格,因此可能会意外选择新出列的单元格。
这就是items
数组也保持isSelected
状态的原因。当一个单元格出现在屏幕上显示时,我们将使用此值来确定该行是否先前已被选中。
因此,当我们选择一行时,我们将更新数据模型([Item]
),然后告诉tableView重新加载该indexPath处的单元格。您也可以使用tableView.reloadData()
,但重新加载所有可见单元格的成本更高。
重新加载选定/取消选择的单元格调用tableView:numberOfRowsInSection
并使用更改的数据模型(items
数组)刷新tableView中的该行,然后单元格将显示为已选中或未选中。
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
// Remove the following line. This will create a NEW cell. It is not the same cell that is visible currently on the screen.
// var theCell = tableView.cellForRowAtIndexPath(indexPath)!
// Toggle the selected state of this cell (e.g. if it was selected, it will be deselected)
items[indexPath.row].isSelected = !items[indexPath.row].isSelected
// Update your stored total based on the value of this item
if items[indexPath.row].isSelected {
total = total + items[indexPath.row].value
self.mytotal.text = String(total)
} else {
total = total - items[indexPath.row].value
self.mytotal.text = String(total)
}
// Tell the table to reload the cell that has changed
tableView.beginUpdates()
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)
tableView.endUpdates()
}
另请注意,每个项目的+/- 5和+/- 10值也存储在数据模型中。这样,如果您创建具有不同值的未来项目,只需将它们添加到items
数组并设置项目value
变量。
另一件事。如果您在选择单元格时不希望单元格变暗,可以将行cell.selectionStyle = .None
添加到tableView:cellForRowAtIndexPath
方法中。
希望有所帮助!
更新1:
我在上面的答案中将selected
修改为isSelected
。抱歉打字错误。不要忘记在tableView:cellForRowAtIndexPath
中指出是否已检查过单元格:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("myCell")!
cell.textLabel!.text = self.items[indexPath.row].name // Get name
// When the the cell scrolls back on screen, you will need to make sure it is checked if this cell was selected before going off the screen,
// and you need to remove the checkmark on a cell if it is being reused
if items[indexPath.row].isSelected {
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
} else {
cell.accessoryType = UITableViewCellAccessoryType.None
}
cell.selectionStyle = .None
return cell
}