我有一个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
}
答案 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
}
}
}
}
希望它对你有所帮助。