选择行并添加/删除复选标记并添加数量swift

时间:2016-07-08 18:07:15

标签: swift if-statement

我在视图控制器中有一个表视图,我想要实现的结果是,如果选择了行,则为行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)
    }

}


}

1 个答案:

答案 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
  }