ios - 使用 Firebase 实时数据库点击时如何更改按钮的图像
问题描述
我是 Swift 的初学者。我想在从 Firebase 实时数据库中检索到按钮的图像后以及点击时更改按钮的图像。我正在使用一个名为的自定义类CustomClass
,如果数据库中的布尔值为 true,我尝试设置图像,如果值为 false,则将其设置为 nil。
我的问题:
- 从 Firebase 检索数据后,我无法更改图像。
- 我第一次点击时可以更改它,但第二次我无法更改它。
在 cellForRowAt 方法中,
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = InfoTableView.dequeueReusableCell(withIdentifier: "customcell", for: indexPath) as! CustomCell
let keyword = cell.nameLabel.text
var reference: DatabaseReference!
cell.buttonAction = { sender in
if (sender as AnyObject).imageView?.image != nil{
cell.prayButton.setImage(nil, for: .normal)
reference = Database.database().reference().child("check" ).child(keyword!).child("prayCheck")
reference.setValue(false)
} else{
let image = UIImage(named: "check")
cell.prayButton.setImage(image, for: .normal)
reference = Database.database().reference().child("check").child(keyword!).child("prayCheck")
reference.setValue(true)
}
}
cell.moneyButtonAction = { sender in
if (sender as AnyObject).imageView?.image != nil {
cell.moneyButton.setImage(nil, for: .normal)
reference = Database.database().reference().child("check").child(keyword!).child("moneyCheck")
reference.setValue(false)
} else {
let image = UIImage(named: "check")
cell.moneyButton.setImage(image, for: .normal)
reference = Database.database().reference().child("check").child(keyword!).child("moneyCheck")
reference.setValue(true)
}
}
cell.atentionButtonAction = { sender in
if (sender as AnyObject).imageView?.image != nil {
cell.alartButton.setImage(nil, for: .normal)
reference = Database.database().reference().child("check").child(keyword!).child("atentionCheck")
reference.setValue(false)
} else {
let image = UIImage(named: "check")
cell.alartButton.setImage(image, for: .normal)
reference = Database.database().reference().child("check").child(keyword!).child("atentionCheck")
reference.setValue(true)
}
}
return cell
}
在自定义类中,
class CustomCell: UITableViewCell {
@IBOutlet weak var bookingLabel: UILabel!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var applyDateLabel: UILabel!
@IBOutlet weak var nameIcon: UILabel!
@IBOutlet weak var applyIcon: UILabel!
@IBOutlet weak var bookinfIcon: UILabel!
@IBOutlet weak var prayImage: UIImageView!
@IBOutlet weak var receiveMoneyImage: UIImageView!
@IBOutlet weak var atentionImage: UIImageView!
@IBOutlet weak var prayButton: UIButton!
@IBOutlet weak var moneyButton: UIButton!
@IBOutlet weak var alartButton: UIButton!
var pathKey: String!
var reference: DatabaseReference!
var buttonAction: ((Any) -> Void)?
var moneyButtonAction: ((Any) -> Void)?
var atentionButtonAction:((Any) -> Void)?
@IBAction func buttonPressed(_ sender: Any){
self.buttonAction?(sender)
}
@IBAction func moneyButtonPressed(_ sender: Any) {
self.moneyButtonAction?(sender)
}
@IBAction func atentionButtonPressed(_ sender: Any) {
self.atentionButtonAction?(sender)
}
}
谢谢你。
解决方案
可能是那个参考 - 丢失
尝试进行一些重构
cell.buttonAction = { sender in
configureAction(type: .moneyCheck)
}
并将此代码替换为具有 1 个参数的函数
钱支票/注意支票/祈祷支票
func configureAction(type: FieldTypeEnum) {
let isNotNull = (sender as AnyObject).imageView?.image != nil
reference.setValue(isNotNull)
reference = Database.database().reference().child("check").child(keyword!).child("prayCheck")
let image: UIImage? = isNotNil ? UIImage(named: "check") : nil
cell.prayButton.setImage(image, for: .normal)
}
如果您将放入 Enum 会更好