【问题标题】:Checkbox in UITableView change and revert imagesUITableView 中的复选框更改和还原图像
【发布时间】:2015-08-28 08:15:52
【问题描述】:

我有一个带有自定义 tableViewCell 的 tableView。每个单元格的左侧都有一个图像(参见屏幕 1)。自定义 tableViewCell 已被子类化。每行都有不同的图像,这取决于 indexPath.row

如果我单击屏幕上的图像,图像应更改为复选框,以便用户可以多选(参见屏幕 2)。如果我点击带有勾号的图像,它应该恢复到屏幕 1 上的旧图像。

问题: 我知道如何将图像更改为刻度线,但不知道如何返回旧图像(请记住每一行都有不同的图像 - 所以我下面代码中的“else”部分没有意义)。

以下是我更改和还原图像的代码

@IBAction func imageTap(sender: AnyObject) {    
    let imageView : UIImageView! = sender.view! as! UIImageView
    if imageView.image != UIImage(named: "Oval 5"){
        imageView.image = UIImage(named: "Oval 5")
        awardBadge.hidden = false
    }
    else // Need to figure out how to go back to same image
    {
        imageView.image = UIImage(named: "Oval 1") 
        awardBadge.hidden = true
    }
}

【问题讨论】:

  • else 的情况是否曾经达到?我怀疑图像比较是正确的方法,您应该向单元格(或单元格的容器以说明出队等)添加一些属性,其中包含是否已检查并包含应显示的 UIImage 如果它没有被选中。
  • 尝试使用它来比较 2 UIImage func equal(image1 : UIImage , image2:UIImage) -> Bool { guard let data1 = UIImagePNGRepresentation(image1) else {return false} guard let data2 = UIImagePNGRepresentation(image2) else {return false} return data1.isEqualToData(data2) } 也可以覆盖 ==

标签: ios swift uitableview checkbox swift2


【解决方案1】:

在您的单元格中添加一个名为“isTicked”或类似名称的布尔值,并在选择/取消选择时将其设置为正确的值。基于此值,您可以设置正确的图像。让细胞完成其余的工作。

比较图像会导致不必要的复杂性和性能下降。

【讨论】:

    【解决方案2】:
    1. 您应该跟踪选定的项目。最简单的方法是在视图控制器的子类中定义一个布尔数组。
    2. 为您定义 UITableViewCell 的子类的委托,例如:

      protocol MYCustomCellDelegate {
       func didSelectedCell(cell: MYCustomCell)
      }
      

    并在您的控制器中处理它:

    func didSelectedCell(cell: MYCustomCell)
    {
        let indexPath = tableView.indexPath(cell: cell)
        selectedItems[indexPath.row] = !selectedItems[indexPath.row]
        tableView.reloadItemsAtIndexPaths([indexPath])
    }
    
    1. cellForItemAtIndexPath 方法中,根据selectedItems[indexPath.row] 设置单元格的状态。如果选中则显示复选框,如果不是 - 图片:

      override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
          let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as! MYCustomCell
          cell.setTitle(titles[indexPath.row])
          cell.setSelected(selectedItems[indexPath.row])
          cell.delegate = self
          return cell
      }
      

    【讨论】:

      【解决方案3】:

      我认为您的方法会有所不同,为什么不使用自定义图像按钮,其中包含 2 个不同的图像,分别代表选定状态和正常状态。可用状态为正常/突出显示/选择/禁用。当我们有自定义图像按钮时,由于您使用的是静态图像,因此您可以将图像用于默认状态,将图像用于选定状态。您所要做的就是使用内置属性selected

      【讨论】:

      • 问题是我想多选..所以当我选择另一个图像时,刻度线会从第一个图像上消失..如果有解决方案请告诉我..也没有找到选中的状态——只看到突出显示的状态
      • 签入故事板,我的回答中应该有按钮,PFA
      • 有没有办法不使用按钮 - 最终我想使用 drawRect 创建图像?
      • 你可以试试这个,让我知道,如果它有效。 imageView.image = UIImage(named: "Oval 1", inBundle: NSBundle(forClass: self.dynamicType), compatibleWithTraitCollection: self.traitCollection)
      • 您能否提供更多代码..我是 iOS 新手..不确定您希望我在什么地方以及在哪里尝试上述代码
      猜你喜欢
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 2023-04-09
      • 2011-12-08
      相关资源
      最近更新 更多