我有一个自定义的UITableView,单元格而不是行,共有5个单元格。每个单元格都有一个按钮,我希望第五个单元格按钮(tableButton)与其余单元格具有不同的标题。
这完全适用于我下面的代码,前4个单元格最初根据代码具有正确的标题。然而,当我向下滚动第5个单元格(具有预期的标题)然后向上滚动到第一个单元格时,第一个单元格现在已更改为特定于第五个单元格的标题。
我在if cell.tableButton.tag == 4条件中添加了一个print语句,每次向下滚动到第五个单元格时都会打印出来。
import UIKit
class TableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 5
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell
cell.layer.borderWidth = 1
cell.layer.borderColor = UIColor.gray.cgColor
cell.tableButton.tag = indexPath.section
if indexPath.section == 4 {
cell.tableTitle.isHidden = true
cell.tableButton.setTitle("Special", for: .normal)
} else {
cell.tableButton.setTitle("Normal", for: .normal)
}
return cell
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let returnedView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: 15))
returnedView.backgroundColor = UIColor.groupTableViewBackground
return returnedView
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 15
}
}
CustomCell.swift:
import UIKit
class CustomCell: UITableViewCell {
@IBOutlet weak var tableButton: UIButton!
@IBOutlet weak var tableTitle: UILabel!
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
}
}
答案 0 :(得分:0)
我想这是因为您使用的是dequeReusableCell
方法。由于你的桌面视图中只有5个单元格,我不认为如果你不再破坏单元格会对你造成伤害,而是每次都创建一个新的单元格实例。这不是最佳做法,但它是一个简单的解决方案!
答案 1 :(得分:0)
我已经重新创建了您的方案,但我没有遇到任何问题。我想这可能与你CustomCell
中的某些内容有关。
<强> ViewController.swift:强>
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
}
extension ViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 5
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
if indexPath.section == 4 {
cell.tableButton.setTitle("Special", for: .normal)
} else {
cell.tableButton.setTitle("Normal", for: .normal)
}
return cell
}
}
extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 250
}
}
<强> CustomCell.swift:强>
import UIKit
class CustomCell: UITableViewCell {
@IBOutlet weak var tableButton: UIButton!
override func prepareForReuse() {
tableButton.setTitle("RESET", for: .normal)
}
}
当然,这是UITableView
的简化实现,但您可以在示例中添加更多代码,也许其他人可以查看或重新创建您的问题。
答案 2 :(得分:0)
这看起来像是一个单元重用问题,因为您使用tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
这里有几个解决方案。第一种方法是不重用并创建一个新的,但这将是性能不佳的,因为将使用更多的内存。
更好的解决方案是准备tableViewCell中的重用。您应该覆盖自定义tableViewCell中的方法prepareForReuse
。在该方法中,将视图设置为它的初始状态(文本,字母等)。请记得先拨打super.prepareForReuse
。