Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios TableViewCell按钮在TableViewControl的多个部分中单击激发_Ios_Swift_Uitableview_Tableviewcell - Fatal编程技术网

Ios TableViewCell按钮在TableViewControl的多个部分中单击激发

Ios TableViewCell按钮在TableViewControl的多个部分中单击激发,ios,swift,uitableview,tableviewcell,Ios,Swift,Uitableview,Tableviewcell,有点奇怪,我似乎无法理解,所以我在viewcontroller中有一个tableview控件,在tableviewcell中有一个使用委托的按钮 因此,当单击按钮时,它将更改单元格的标记号,并根据tableview中单元格的标记更改按钮的图像 但我遇到的问题是,当你在一行中选择一个按钮,即第一个按钮时,它似乎在运行函数来更改一个部分中每个项目的图像。也就是说,选择第5个项目将在单元格中每隔5个按钮更新一次所选图像,这很奇怪。因为它几乎就像tableview被分成5个部分 是否有人可以帮助防止这种

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

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

但我遇到的问题是,当你在一行中选择一个按钮,即第一个按钮时,它似乎在运行函数来更改一个部分中每个项目的图像。也就是说,选择第5个项目将在单元格中每隔5个按钮更新一次所选图像,这很奇怪。因为它几乎就像tableview被分成5个部分

是否有人可以帮助防止这种行为,使其仅更改单元格中已按下按钮的图标

下面是我使用过的函数和dropbox上显示该行为的视频链接

代表

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)

}
代表功能

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
    }
}

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

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

        let cell = tableView.dequeueReusableCellWithIdentifier("cellID")
...
就像你应该做的那样。但是,dequeueReusableCellWithIdentifier会重新使用单元格,因此,如果您更改了单元格中的任何内容(如添加按钮),则这些按钮仍将位于回收的单元格中

因此,您必须在单元格中为每个单元格设置book mark状态

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

编辑样本代码

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)

}
在你的

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变量,您应该在DIDBookmark项中更改该变量,以便重用表视图单元格。选择单元格并更改其标记号并将所选单元格从表视图中滚动出来后,它将再次用于在显示的新行的索引路径处显示行。由于其标记表示选定单元格的标记,因此显示为高亮显示

尝试在表视图中查找有关单元重用的信息


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

正如其他人所说,这是由于表单元格重复使用。您希望您的tableView(u:cellForRowAtIndexPath:)方法始终更新模型中的单元格状态。书签状态应该是模型的属性。当用户更改单元格的书签按钮状态时,新状态应反映在模型中。如果执行这些操作,表单元格状态将始终正确。如果尚未定义自定义UITableViewCell类,最好始终定义一个自定义UITableViewCell类,该类包含表视图单元格中所有视图和控件的出口(书签按钮将有一个出口)。此外,在自定义单元格类中,当捕获按钮选择时,您可以通过委托调用控制器(正如您所做的)或单元格上定义的“bookmarkschanged”处理程序(closure)。我更喜欢closure方法。如果您希望看到此方法的工作示例,请告诉我


另外,取消标记。您不需要标记来跟踪书签按钮的选择状态,除非它比您显示/描述的内容更详细。如果您按照我描述的方法进行操作,它会得到处理。

是的,我一直在使用它,是否有任何相关信息?因为我真的不想要这个功能,最好的方法就是使用它这样做(节省内存),但每次将你的单元格排队重置为标准设置。通过重置,你能再解释一点吗?请不要太确定我是否理解你的意思。谢谢你的朋友,我稍后会尝试:)我能看一个这样的工作示例吗?我用标签来改变图像,这不是一个好方法吗?你可以用标签。我只是觉得这太过分了。让您的模型跟踪该选择状态。如果模型类具有“bookmarked”(booll)属性,并且每次选择按钮时按钮选择操作方法都会反转该属性状态,并且您总是从模型状态更新单元格,则不需要使用标记。这有意义吗?