选择 Table 中的单元格无法正常工作
Selecting Cells in Table Not Working Correctly
我在 TableViewController 中有一个静态 table。每当我 select 一行时,它都会用灰色填充整个单元格。它对我点击的每一行都这样做。如果我使用:
cell.selectionStyle = .none
它会使单元格填充为白色。
Tableview 属性检查器:
TableViewCell 属性检查器:
TableViewController:
import UIKit
class OptionTableViewController: UITableViewController {
@IBOutlet var optionsTable: UITableView!
let defaults = UserDefaults.standard
let numberOfRows = [7,2]
let cellIdentifier = "OptionCells"
override func viewDidLoad() {
super.viewDidLoad()
optionsTable.register(UITableViewCell.self, forCellReuseIdentifier: cellIdentifier)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that con be recreated.
}
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 2
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
var rows = 0
if(section < numberOfRows.count){
rows = numberOfRows[section]
}
return rows
}
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.selectionStyle = .none
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
cell.textLabel?.text = optionSelections[indexPath.row]
return cell
}
}
我相信我已经正确设置了所有内容。为什么当我点击它们时它会填充单元格?
更新:
我更新了代码以显示我目前拥有的内容。
更新二:
我附上了几张图片来展示 table 在点击每个其他单元格之前和之后的样子。
更新 3:
我正在出列单元格以将附件类型更改为复选标记。
之前:
之后:
您需要在选择发生之前设置 selectionStyle。
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.selectionStyle = .none
cell.selectedBackgroundView = UIView() // optional
cell.selectedBackgroundView?.backgroundColor = UIColor.white // optional
}
正如评论中所讨论的,我认为问题是 didSelectRow(at:)
方法中单元格出列的症状:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
}
您应该改用
let cell = tableView.cellForRow(at: indexPath)
获取当前位于给定 indexPath 的单元格(请注意,如果该 indexPath 已被滚动关闭或从未出现在屏幕上,它可能 return nil)。出队让一个未使用的单元格进入给定的 indexPath -(我认为)然后位于现有单元格的前面 - 因此出现奇怪的行为。
我在 TableViewController 中有一个静态 table。每当我 select 一行时,它都会用灰色填充整个单元格。它对我点击的每一行都这样做。如果我使用:
cell.selectionStyle = .none
它会使单元格填充为白色。
Tableview 属性检查器:
TableViewCell 属性检查器:
TableViewController:
import UIKit
class OptionTableViewController: UITableViewController {
@IBOutlet var optionsTable: UITableView!
let defaults = UserDefaults.standard
let numberOfRows = [7,2]
let cellIdentifier = "OptionCells"
override func viewDidLoad() {
super.viewDidLoad()
optionsTable.register(UITableViewCell.self, forCellReuseIdentifier: cellIdentifier)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that con be recreated.
}
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 2
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
var rows = 0
if(section < numberOfRows.count){
rows = numberOfRows[section]
}
return rows
}
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.selectionStyle = .none
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
cell.textLabel?.text = optionSelections[indexPath.row]
return cell
}
}
我相信我已经正确设置了所有内容。为什么当我点击它们时它会填充单元格?
更新: 我更新了代码以显示我目前拥有的内容。
更新二: 我附上了几张图片来展示 table 在点击每个其他单元格之前和之后的样子。
更新 3: 我正在出列单元格以将附件类型更改为复选标记。
之前:
之后:
您需要在选择发生之前设置 selectionStyle。
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.selectionStyle = .none
cell.selectedBackgroundView = UIView() // optional
cell.selectedBackgroundView?.backgroundColor = UIColor.white // optional
}
正如评论中所讨论的,我认为问题是 didSelectRow(at:)
方法中单元格出列的症状:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
}
您应该改用
let cell = tableView.cellForRow(at: indexPath)
获取当前位于给定 indexPath 的单元格(请注意,如果该 indexPath 已被滚动关闭或从未出现在屏幕上,它可能 return nil)。出队让一个未使用的单元格进入给定的 indexPath -(我认为)然后位于现有单元格的前面 - 因此出现奇怪的行为。