Swift 3按钮从tableView单元格

时间:2017-07-22 22:51:20

标签: ios swift uitableview

我正在尝试创建一个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
}

因此,这会将按钮放在每个单元格中,但是当我单击单元格时,相关按钮会消失,或者当我向下滚动时,当我向上滚动时,大多数前几个按钮都消失了。我在这做错了什么?任何帮助将不胜感激!

提前致谢。

2 个答案:

答案 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. 

两行都不应该使用。