根据Model更新UIButton的图像

时间:2016-07-07 23:09:30

标签: swift uitableview uibutton

我有一个UITableView,其中每个单元格从我的模型类获取其数据,这是我的TableViewController类中的数组。每个单元格的模型在 cellForRowAtIndexPath 中设置。我的模型有一个“isFavorited”属性。我的自定义单元格类有一个带有星形图像的UIButton。

如果 model.isFavorited == false ,则UIButton图片为灰色星。

如果 model.sFavorited == true ,UIButton图片应更改为黄色星。

到目前为止,我试图这样做:

private let normal = UIImage(named: "star")
private let selection = UIImage(named: "star highlighted")

class CustomCell: UITableViewCell {
      var model: Model? {
          didSet{
             favoriteButton.selected = (model?.isFavorite)!
          }
      }

      @IBOutlet var favoriteButton: UIButton!

      override func awakeFromNib() {
          super.awakeFromNib()
          favoriteButton.adjustsImageWhenHighlighted = true
          favoriteButton.setImage(normal, forState: .Normal)
          favoriteButton.setImage(selection, forState: .Highlighted)
          favoriteButton.setImage(selection, forState: .Selected)
      }

      @IBAction func favoriteTapped(sender: AnyObject) {
          //UPDATE THE MODEL
          model?.isFavorite = !(model?.isFavorite)!
      }

}

此代码成功地将星形从灰色变为黄色,反之亦然,这要归功于调用didSet以使用favoriteButton.selected中的值更新(model?.isFavorite)!布尔值。

然而,当我在我的桌面视图中滚动得足够远,并尝试回到我喜欢的特定单元格时,图像将重新显示为不受欢迎的(灰色星而不是黄色星)。

如果我点击按钮时我的模型正在更新,并且由于此更改而在didSet期间调整了UIButton的图像,为什么在滚动回到此单元格时它会恢复到默认状态?

编辑: 我在 cellForRowAtIndexPath

中的代码
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell: CustomCell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier, forIndexPath: indexPath) as! CustomCell
    cell.model = modelArray[indexPath.row]
    return cell
}

1 个答案:

答案 0 :(得分:0)

基本上,您可以使用基于点按的自定义图像对UIButton进行子类化。我遇到了同样的问题并使用以下方法解决了这个问题:

class FavioriteButton: UIButton {
    //Images
    let normalImage = UIImage(named: "star")! as UIImage
    let selectedImage = UIImage(named: "star_highlighted")! as UIImage

    //Bool property
    var isSelected: Bool = false {
        didSet {
            if isSelected == true {
                self.setImage(normalImage, forState: .Normal)
            }else{
                self.setImage(selectedImage, forState: .Normal)
            }
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        self.addTarget(self, action: #selector(buttonClicked(_:)), forControlEvents: .TouchUpInside)
        self.isSelected = false
    }

    func buttonClicked(sender: UIButton) {
        if sender == self {
            if isSelected == true {
                isSelected = false
            }else{
                isSelected = true
            }
        }
   }
}

希望它对你有所帮助。