Add/Remove Swift 4 UITableView 中选定行的多个复选标记
Add/Remove Multiple Checkmarks on Selected Rows in Swift 4 UITableView
询问,因为所有可用的解决方案都适用于 Swift 3。
另外,我正在处理一个问题,当我在突出显示 + 选择一行后上下滚动时,也会检查(但不突出显示)以相同 indexPath(滚动后)出现的新行。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) {
cell.accessoryType = .checkmark
}
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) {
cell.accessoryType = .none
}
}
与其在 didSelectRowAt
和 didDeselectRowAt
方法上更改 accessoryType
,您应该从单元格 class 覆盖并在 setSelected(_:animated:) 上执行此操作。
class YourCellClass: UITableViewCell {
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
if selected {
accessoryType = .checkmark
} else {
accessoryType = .none
}
}
}
您可以使用集合来确定某项是否已选中。
并添加以下内容:
var items: [(text: String, checked: Bool)] = [] //example, can be what ever you want
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell() //you can reuse cell for performance
let item = items[indexPath.row]
cell.textLabel?.text = item.text //set text
cell.accessoryType = item.checked ? .checkmark : .none //mark cell base on array
return cell
}
并在其他方法(didSelect & didDeselect)中更新数组中的数据
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) {
cell.accessoryType = .checkmark
items[indexPath.row].checked = true //add this
}
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) {
cell.accessoryType = .none
items[indexPath.row].checked = false //add this
}
}
修改后 - 您的 table 视图将不会再次标记错误的单元格
你可以用我的方式:
在单元格中放置一个按钮并像这样使用它:
var arrSelectedRows:[Int] = []
//MARK:- UITableView Delegate Methods
func numberOfSections(in tableView: UITableView) -> Int {
return 1;
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return arrCategoryData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier : String = "MenuPopupTBCell";
var cell : MenuPopupTBCell! = tblMenuListing.dequeueReusableCell(withIdentifier: cellIdentifier) as! MenuPopupTBCell;
if (cell == nil) {
cell = MenuPopupTBCell.init(style: UITableViewCellStyle.default, reuseIdentifier: cellIdentifier);
}
cell.btnCategoryTitle.imageView?.contentMode = .scaleAspectFit
let data = arrCategoryData[indexPath.row] as! [String:Any]
cell.btnCategoryTitle.setTitle(data["title"] as? String, for: .normal)
let id = data["id"] as! Int
if arrSelectedRows.contains(id){
cell.btnCategoryTitle.setImage(UIImage(named:"checkBoxChecked"), for: .normal)
}else{
cell.btnCategoryTitle.setImage(UIImage(named:"checkBocUnchecked"), for: .normal)
}
cell.btnCategoryTitle.tag = id
cell.btnCategoryTitle.addTarget(self, action: #selector(checkBoxSelection(_:)), for: .touchUpInside)
return cell;
}
@objc func checkBoxSelection(_ sender:UIButton)
{
if self.arrSelectedRows.contains(sender.tag){
self.arrSelectedRows.remove(at: self.arrSelectedRows.index(of: sender.tag)!)
}else{
self.arrSelectedRows.append(sender.tag)
}
self.tblMenuListing.reloadData()
}
This way you get all the selected id in the arrSelectedRows
so you
can use it as required
输出:-
询问,因为所有可用的解决方案都适用于 Swift 3。 另外,我正在处理一个问题,当我在突出显示 + 选择一行后上下滚动时,也会检查(但不突出显示)以相同 indexPath(滚动后)出现的新行。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) {
cell.accessoryType = .checkmark
}
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) {
cell.accessoryType = .none
}
}
与其在 didSelectRowAt
和 didDeselectRowAt
方法上更改 accessoryType
,您应该从单元格 class 覆盖并在 setSelected(_:animated:) 上执行此操作。
class YourCellClass: UITableViewCell {
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
if selected {
accessoryType = .checkmark
} else {
accessoryType = .none
}
}
}
您可以使用集合来确定某项是否已选中。 并添加以下内容:
var items: [(text: String, checked: Bool)] = [] //example, can be what ever you want
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell() //you can reuse cell for performance
let item = items[indexPath.row]
cell.textLabel?.text = item.text //set text
cell.accessoryType = item.checked ? .checkmark : .none //mark cell base on array
return cell
}
并在其他方法(didSelect & didDeselect)中更新数组中的数据
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) {
cell.accessoryType = .checkmark
items[indexPath.row].checked = true //add this
}
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) {
cell.accessoryType = .none
items[indexPath.row].checked = false //add this
}
}
修改后 - 您的 table 视图将不会再次标记错误的单元格
你可以用我的方式:
在单元格中放置一个按钮并像这样使用它:
var arrSelectedRows:[Int] = []
//MARK:- UITableView Delegate Methods
func numberOfSections(in tableView: UITableView) -> Int {
return 1;
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return arrCategoryData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier : String = "MenuPopupTBCell";
var cell : MenuPopupTBCell! = tblMenuListing.dequeueReusableCell(withIdentifier: cellIdentifier) as! MenuPopupTBCell;
if (cell == nil) {
cell = MenuPopupTBCell.init(style: UITableViewCellStyle.default, reuseIdentifier: cellIdentifier);
}
cell.btnCategoryTitle.imageView?.contentMode = .scaleAspectFit
let data = arrCategoryData[indexPath.row] as! [String:Any]
cell.btnCategoryTitle.setTitle(data["title"] as? String, for: .normal)
let id = data["id"] as! Int
if arrSelectedRows.contains(id){
cell.btnCategoryTitle.setImage(UIImage(named:"checkBoxChecked"), for: .normal)
}else{
cell.btnCategoryTitle.setImage(UIImage(named:"checkBocUnchecked"), for: .normal)
}
cell.btnCategoryTitle.tag = id
cell.btnCategoryTitle.addTarget(self, action: #selector(checkBoxSelection(_:)), for: .touchUpInside)
return cell;
}
@objc func checkBoxSelection(_ sender:UIButton)
{
if self.arrSelectedRows.contains(sender.tag){
self.arrSelectedRows.remove(at: self.arrSelectedRows.index(of: sender.tag)!)
}else{
self.arrSelectedRows.append(sender.tag)
}
self.tblMenuListing.reloadData()
}
This way you get all the selected id in the
arrSelectedRows
so you can use it as required
输出:-