奇怪的一点,我似乎无法理解所以我在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
}
}
答案 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)
重复使用表格视图单元格。选择单元格并更改其标记号并将所选单元格滚出表格视图后,将再次使用该单元格在显示的新行的索引路径上显示一行。由于其标签代表所选单元格的标签,因此会以高亮显示。
尝试在表格视图中查找单元格重用。
您需要更改有关确定要将哪个单元格显示为所选单元格的方法。将其添加为数据源中的属性,并根据该属性将书签设置为已选择或未选中。