ios - UITableView 自定义单元格按钮从主视图中选择其他按钮?
问题描述
在我的自定义 tableviewcell 上,我有一个按钮,用户可以按下该按钮在选定和未选定之间切换。这只是一个简单的 UIButton,这个按钮包含在我的 customtableviewcell 中作为插座。
import UIKit
class CustomCellAssessment: UITableViewCell {
@IBOutlet weak var name: UILabel!
@IBOutlet weak var dateTaken: UILabel!
@IBOutlet weak var id: UILabel!
@IBOutlet weak var score: UILabel!
@IBOutlet weak var button: UIButton!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
@IBAction func selectButton(_ sender: UIButton) {
if sender.isSelected{
sender.isSelected = false
}else{
sender.isSelected = true
}
}
}
奇怪的是,当我按下第一个单元格上的按钮时,它会在同一个表格视图中的另一个单元格(视图之外)上选择一个按钮 8 个单元格。每个单元格都有自己的按钮,但好像使用 dequeReusableCell 会导致系统以这种方式运行。为什么要这样做,这与 UIbuttons 在 tableviewcells 上的工作方式有关吗?
谢谢
解决方案
每个单元格都有自己的按钮,但好像使用 dequeReusableCell 会导致系统以这种方式运行。
错误的。UITableViewCells 是可重用的,所以如果你的 tableView 有 8 个可见的单元格,当加载第 9 个时,单元格 nr 1 将被重用。
解决方案:您需要跟踪细胞的状态。调用该方法时cellForRowAtIndexPath
,您需要从头开始配置单元格。
您可以在 ViewController 中有一个包含单元格状态的小数组:
var cellsState: [CellState]
并将每个 indexPath 的选定状态存储在那里。然后在 cellForRowAtIndexPath 中,为单元格配置状态。
cell.selected = self.cellsState[indexPath.row].selected
所以,我要做的概述是:
1 - 在cellForRowAtIndexPath
, 我会设置
cell.button.tag = indexPath.row
cell.selected = cellsState[indexPath.row].selected
2 - 将 IBAction 移动到您的 ViewController 或 TableViewController
3 - 当点击方法被调用时,更新单元格的选中状态
self.cellsState[sender.tag].selected = true
请记住始终将整个单元格配置为cellForRowAtIndexPath
编辑:
import UIKit
struct CellState {
var selected:Bool
init(){
selected = false
}
}
class MyCell: UITableViewCell {
@IBOutlet weak var button: UIButton!
override func awakeFromNib() {
self.button.setTitleColor(.red, for: .selected)
self.button.setTitleColor(.black, for: .normal)
}
}
class ViewController: UIViewController, UITableViewDataSource {
var cellsState:[CellState] = []
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
//Add state for 5 cells.
for _ in 0...5 {
self.cellsState.append(CellState())
}
}
@IBAction func didClick(_ sender: UIButton) {
self.cellsState[sender.tag].selected = true
self.tableView.reloadData()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cellsState.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! MyCell
cell.button.isSelected = self.cellsState[indexPath.row].selected
cell.button.tag = indexPath.row
return cell
}
}
推荐阅读
- imagemagick - Imagemagick 没有在修剪上定义图像
- python - 使用 Beautiful Soup select 或 lxml xpath 从 html 获取 href
- vue.js - 如何使用事件总线正确地将数据从子组件传递到父组件?
- android - 放置意图过滤文件的目录
- python - 如何处理TypeError:必须是str,而不是float
- amazon-web-services - 在 Terraform 中覆盖 STS API 端点时的 SignatureDoesNotMatch
- ios - iOS 应用程序无法检测到它在 CLBeaconRegion 内
- ruby-on-rails - 使用friendly_id gem 避免 RecordNotFound 异常
- python - 在另一个numpy数组中查找数组字符串序列
- spring - 如何在 Spring Session 中实现 HTTP 会话激活监听器