在UITableView中添加单元格和滚动会导致奇怪的行为

时间:2016-06-29 17:13:57

标签: ios iphone swift uitableview

我试图添加一个拉动以向我的tableview添加单元格功能,并且无法正确显示我的数据。目前它的工作方式是当用户开始向下拉时,占位符单元被放置为子视图,直到用户放开或拉下足够远。一旦用户拉下足够远的距离,就会将一个新的ToDoItem添加到ToDo项目数组中,其中构建了tableview,然后重新加载数据以显示新项目并删除占位符单元格。它工作正常,直到我开始删除并检查单元格。一旦我这样做,一些细胞似乎被检查,尽管没有检查它们,其他细胞消失,直到我点击它们。

The behavior can be seen here

所有这些功能都在我的TableViewController

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TodoTableViewCell

    // Configure the cell...
    let item = todoList[(indexPath as NSIndexPath).row]
    cell.textField.text = item.text
    cell.selectionStyle = .none        
    cell.delegate = self
    cell.toDoItem = item

    // make seperators go edge to edge
    cell.layoutMargins = UIEdgeInsetsZero

    return cell
}

// delete task from list
func deleteItem(_ item: ToDoItem) {
    let index = todoList.index(of: item)
    if  index == nil {
        return
    }
    todoList.remove(at: index!)
    tableView.reloadData()
}

var count = 0

func addItem() {
    count += 1
    let toDoItem = ToDoItem(text: "New cell " + String(count))
    todoList.insert(toDoItem, at: 0)
    tableView.reloadData()
    //tableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .none)
}

let placeHolderCell = TodoTableViewCell()
var pullDown = false

override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    pullDown = scrollView.contentOffset.y <= 0.0
    if pullDown {
        placeHolderCell.backgroundColor = settings.backgroundColor
        placeHolderCell.textField.text = "Pull down to add"
        tableView.insertSubview(placeHolderCell, at: 0)
    }
}

override func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y < 0 && pullDown {
        placeHolderCell.frame = CGRect(x: 0, y: -tableView.rowHeight, width: tableView.frame.size.width, height: tableView.rowHeight)
        if scrollView.contentOffset.y < -tableView.rowHeight && pullDown {
            scrollView.isScrollEnabled = false
        }
    }
    else {
        placeHolderCell.removeFromSuperview()
        pullDown = false
    }

}

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if !scrollView.isScrollEnabled {
        addItem()
        placeHolderCell.removeFromSuperview()
        scrollView.isScrollEnabled = true
    }
    pullDown = false
}

0 个答案:

没有答案