我正在尝试创建一个tableView,它(现在)每个单元格中只有一个按钮。
我将行数硬编码为100:
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 100
}
这是我的cellForRowAt函数创建按钮,并假设将其正确放置在每个单元格中:
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "Cell")
let row = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let btn = UIButton(type:(UIButtonType.custom)) as UIButton
btn.backgroundColor = UIColor.black
btn.setTitle("(read more)", for: UIControlState.normal)
btn.titleLabel!.font = UIFont(name: "Helvetica", size: 10)
btn.frame = CGRect(x:300, y:row.bounds.height, width:70, height:20)
btn.addTarget(self, action: Selector(("buttonPressed:")), for: UIControlEvents.touchUpInside)
btn.tag = indexPath.row
cell.contentView.addSubview(btn)
return cell
}
因此,这会将按钮放在每个单元格中,但是当我单击单元格时,相关按钮会消失,或者当我向下滚动时,当我向上滚动时,大多数前几个按钮都消失了。我在这做错了什么?任何帮助将不胜感激!
提前致谢。
答案 0 :(得分:2)
此示例可能会对您有所帮助:
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet fileprivate weak var tableView: UITableView!
fileprivate let numberOfItems = 100
override func viewDidLoad() {
super.viewDidLoad()
tableView.contentInset.top = 44
}
@objc fileprivate func buttonPressed(sender: UIButton) {
print("tag: \(sender.tag)")
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return numberOfItems
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let accessory = UIButton(frame: CGRect(x: 0, y: 0, width: 70, height: 20))
accessory.backgroundColor = .black
accessory.setTitle("Read more", for: .normal)
accessory.titleLabel?.font = UIFont(name: "Helvetica", size: 12)
accessory.tag = indexPath.row
accessory.addTarget(self, action: #selector(buttonPressed(sender:)), for: .touchUpInside)
cell.accessoryView = accessory
return cell
}
}
答案 1 :(得分:0)
您必须每次在cellForRowAt
中创建一个单元格,而不要使该单元格脱离队列并再次绘制内容。一次又一次地创建一个单元不是一个好主意。发现自己的错误并解决问题将是学习的另一条曲线。
l
et cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "Cell") // should not do
let row = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) // can use it.
两行都不应该使用。