TableViewCell按钮单击在TableViewControl

时间:2015-10-03 10:32:47

标签: ios swift uitableview tableviewcell

奇怪的一点,我似乎无法理解所以我在viewcontroller中有一个tableview控件,在tableviewcell中我有一个使用委托的按钮。

因此,当单击该按钮时,它将更改单元格的标记号,并根据tableview中单元格的标记更改按钮的图像。

但我遇到的问题是,当你选择一行中的按钮,即第一个按钮时,它似乎正在运行该功能,几乎可以更改部分中每个项目的图像。即选择第5项将单元格中的每个第5个按钮更新为所选图像,这很奇怪。因为它几乎就像是将tableview分成5个部分。

任何人都可以帮助防止此行为,因此它只会更改已按下的单元格中按钮的图标。

以下是我使用的功能以及显示行为https://www.dropbox.com/s/a4aasti78872w6j/Help.mov?dl=0

的保管箱上的视频链接

代表

protocol StoryTableViewCellDelegate: class {

    func didBookmarkItem(cell: StoryTableViewCell, sender: AnyObject)

}

代表职能

@IBAction func bookmarkButtonDidTouch(sender: AnyObject) {

    bookmarkButton.animation = "pop"
    bookmarkButton.curve = "easeOut"
    bookmarkButton.duration = 0.5
    bookmarkButton.damping = 0.4
    bookmarkButton.velocity = 0.4
    bookmarkButton.animate()

    // The delegate which will handle bookmarking items
    delegate?.didBookmarkItem(self, sender: sender)

}

在tableview类中使用的函数

// MARK: StoryTableViewDelegate
func didBookmarkItem(cell: StoryTableViewCell, sender: AnyObject) {

    // TODO: Implement bookmark functionality
    switch cell.bookmarkButton.tag {

    case 0:
        cell.bookmarkButton.setImage(UIImage(named: "Bookmark-Selected"), forState: UIControlState.Normal)
        cell.bookmarkButton.tag = 1


    case 1:
        cell.bookmarkButton.setImage(UIImage(named: "Bookmark-Not-Selected"), forState: UIControlState.Normal)
        cell.bookmarkButton.tag = 0
    default:
      break
    }
}

3 个答案:

答案 0 :(得分:1)

原因是,您很可能使用以下方法创建单元格:

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier("cellID")
...
像你应该做的那样。但是dequeueReusableCellWithIdentifier重新使用一个单元格,所以如果您更改了单元格中的任何内容(例如添加按钮),那些按钮仍将位于该循环单元格中。

因此,您必须在每个单元格的cellForRowAtIndexPath中设置书签状态。

我在向单元格添加按钮时遇到了类似的问题,当滚动单元格时,会自动添加额外的按钮。因此,重新使用单元格时,我做的第一件事是删除所有按钮。

编辑示例代码

中的

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)

你必须添加用于将按钮设置为所需状态的代码,它将类似于你在didBookMarkItem中使用的代码:

switch myProperty {

    case 0:
        cell.bookmarkButton.setImage(UIImage(named: "Bookmark-Selected"), forState: UIControlState.Normal)
        cell.bookmarkButton.tag = 1


    case 1:
        cell.bookmarkButton.setImage(UIImage(named: "Bookmark-Not-Selected"), forState: UIControlState.Normal)
        cell.bookmarkButton.tag = 0
    default:
      break
    }

您当然需要一个myProperty变量,您应该在didBookMarkItem中更改

答案 1 :(得分:1)

正如其他人所说,这是由于表格单元重用。您希望tableView(_:cellForRowAtIndexPath :)方法始终更新模型中的单元格状态。您的书签状态应该是模型的属性。当用户更改单元格的书签按钮状态时,新状态应反映在模型中。如果你做这些事情,你的表格单元状态将始终是正确的。如果您还没有,那么总是定义一个自定义UITableViewCell类,它包含表视图单元格中所有视图和控件的出口(您的书签按钮将有一个插座)。此外,在您的自定义单元类中,当您捕获按钮选择,您可以通过委托(正在执行)或单元格上定义的“bookmarkChanged”处理程序(闭​​包)来回调控制器。我更喜欢闭包方法。如果你想看到一个有效的例子,请告诉我。

另外,nix标签。您不需要标记来跟踪书签按钮选择状态,除非它比您显示/描述的更多。如果你按照我描述的方法进行操作,就会得到照顾。

答案 2 :(得分:0)

重复使用表格视图单元格。选择单元格并更改其标记号并将所选单元格滚出表格视图后,将再次使用该单元格在显示的新行的索引路径上显示一行。由于其标签代表所选单元格的标签,因此会以高亮显示。

尝试在表格视图中查找单元格重用。

您需要更改有关确定要将哪个单元格显示为所选单元格的方法。将其添加为数据源中的属性,并根据该属性将书签设置为已选择或未选中。