在最后一个tableView单元格中添加Button滚动时显示两次

时间:2018-01-04 17:41:37

标签: swift tableview cell indexpath

使用Swift4,iOS11.2.1,Xcode9.2,

我成功地将一个自定义按钮添加到tableView的最后一个单元格中。 (该按钮用于在tableView中添加单元格 - 这也可以正常工作......) - 请参阅屏幕截图-1。

但是现在问题是:当添加更多单元格(即超过tableView-height)时,如果滚动到顶部,则会有第二个单元格显示此按钮 - 请参阅屏幕截图-2。

(见下面的代码......)

以下是两个屏幕截图:

enter image description here

如何摆脱额外的按钮???? (似乎一个单元被重复使用,按钮被部分绘制。可以解释截止,因为最后一个单元格的高度比其他单元格大。但是,仍然不应该是按钮的一部分在最后一个单元格中的任何其他单元格中......即使向上滚动也是如此。

任何帮助表示赞赏!

这是我的代码(或者它的例外......):

override func viewDidLoad() {
    super.viewDidLoad()

    // define delegates
    self.fromToTableView.dataSource = self
    self.fromToTableView.delegate = self

    // define cell look and feel
    self.addButton.setImage(UIImage(named: "addButton"), for: .normal)
    self.addButton.addTarget(self, action: #selector(plusButtonAction), for: .touchUpInside)

    //...

    self.fromToTableView.reloadData()
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    guard let resItems = resItems else {
        self.rowCount = 0
        return 0
    }
    self.rowCount = resItems.count - 1
    return resItems.count
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    if(indexPath.row == (self.rowCount)) {
        return 160
    } else {
        return 120
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = fromToTableView.dequeueReusableCell(withIdentifier: "SettingsCell") as? SettingsCustomTableViewCell

    // configure the cell
    cell?.configureCell(tag: indexPath.row)

    // fill cell-data
    if let resItem = self.resItems?[indexPath.row] {
        cell?.connectionItem = resItem
    }

    // add addButton to last cell
    if(indexPath.row == (self.rowCount)) {

        // add addButton
        cell?.contentView.addSubview(self.addButton)
        // scroll to last cell (that was just added)
        // First figure out how many sections there are
        let lastSectionIndex = self.fromToTableView.numberOfSections - 1
        // Then grab the number of rows in the last section
        let lastRowIndex = self.fromToTableView.numberOfRows(inSection: lastSectionIndex) - 1
        // Now just construct the index path
        let pathToLastRow = IndexPath(row: lastRowIndex, section: lastSectionIndex)
        // Scroll to last cell
        self.fromToTableView.scrollToRow(at: pathToLastRow as IndexPath, at: UITableViewScrollPosition.none, animated: true)
    }

    return cell!
}

1 个答案:

答案 0 :(得分:3)

你已经弄明白问题是什么:)

正如你在这里所说:

  

似乎重复使用了一个单元格并且部分绘制了按钮

这就是这里发生的事情。您有一个UITableViewCell元素池,或者您的SettingsCustomTableViewCell元素。所以每当你说:

let cell = fromToTableView.dequeueReusableCell(withIdentifier: "SettingsCell") as? SettingsCustomTableViewCell

然后,顾名思义,您可以从UITableView出列可重复使用的单元格。

这也意味着,无论您以前在单元格上设置的内容(例如您的按钮),只要您重复使用 特定的单元格实例,就会保留在那里。

您可以(至少)以三种方式解决此问题。

The Hack

tableView(_:cellForRowAt:indexPath:)中,你有这个:

if(indexPath.row == (self.rowCount)) {
    //last row, add plus button
}

您可以添加其他部分并再次删除加号按钮:

if(indexPath.row == (self.rowCount)) {
    //last row, add plus button
} else {
    //not last row, remove button
}

正确的方式

UITableViewCell具有函数prepareForReuse,并且文档说明:

  

如果UITableViewCell对象是可重用的 - 也就是说,它有一个重用标识符 - 在从UITableView方法dequeueReusableCell返回对象之前调用此方法(withIdentifier:)

因此,您可以“重置”自定义表格视图单元格。在您的情况下,您删除加号按钮。

您似乎已经有了自定义UITableViewCell,所以这应该是一个很小的改变。

页脚方式

正如@paragon在评论中建议的那样,您可以创建UIView并将其作为tableFooterView添加到UITableView

let footerView = YourFooterViewHere()
tableView.tableFooterView = footerView

希望有所帮助