Swift:cellForRowAtIndexPath中

时间:2017-02-11 14:22:18

标签: ios swift uitableview

我有一个自定义的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
    }

}

3 个答案:

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