Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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 重用UICell时如何刷新UITableView_Ios_Swift - Fatal编程技术网

Ios 重用UICell时如何刷新UITableView

Ios 重用UICell时如何刷新UITableView,ios,swift,Ios,Swift,我有一个UIViewController,里面有一个UITableView。在那个表中,我有几行,每行有几个按钮。当用户单击按钮时,按钮的图标将更改。我设法将按钮的状态保存到一个对象中,但我遇到了一个错误,当我检查所选按钮时,该错误会随机选择其他按钮。 这是我的密码: // MODEL class ChecklistItem: NSObject, NSCoding { // Recorded values var vehiclePass = 0 // 0 = unchecked, 1

我有一个
UIViewController
,里面有一个
UITableView
。在那个表中,我有几行,每行有几个按钮。当用户单击按钮时,按钮的图标将更改。我设法将按钮的状态保存到一个对象中,但我遇到了一个错误,当我检查所选按钮时,该错误会随机选择其他按钮。 这是我的密码:

// MODEL
class ChecklistItem: NSObject, NSCoding {

// Recorded values
    var vehiclePass = 0 // 0 = unchecked, 1 = pass, 2 = fail
    var trailerPass = 0 // 0 = unchecked, 1 = pass, 2 = fail
    var vehicleComment = String()
    var trailerComment = String()
}

以下是单元格的代码:


protocol ChecklistCellDelegate {
    func tappedOnVehicleOrTrailerButtons(vehiclePassBtn: UIButton, vehicleFailBtn: UIButton, trailerPassBtn: UIButton, trailerFailBtn: UIButton, selectedCell: ChecklistCell)
    func tapGestureOnCell(_ selectedCell: ChecklistCell)
}

class ChecklistCell: UITableViewCell {

    // Interface Links
    @IBOutlet weak var questionName: UILabel!
    @IBOutlet weak var vehiclePassButton: UIButton!
    @IBOutlet weak var vehicleFailButton: UIButton!
    @IBOutlet weak var trailerPassButton: UIButton!
    @IBOutlet weak var trailerFailButton: UIButton!
    @IBOutlet weak var vehicleCommentLabel: UILabel!
    @IBOutlet weak var trailerCommentLabel: UILabel!
    @IBOutlet weak var tagIconImageView: UIImageView!
    @IBOutlet weak var tagNameLabel: UILabel!
    @IBOutlet weak var defectImageView: CustomImageView!

    // Constraints Links
    @IBOutlet weak var vehicleCommentHeightConstraint: NSLayoutConstraint!
    @IBOutlet weak var trailerCommentHeightConstraint: NSLayoutConstraint!
    @IBOutlet weak var tagIconHeightConstraint: NSLayoutConstraint!
    @IBOutlet weak var tagNameBottomConstraint: NSLayoutConstraint!
    @IBOutlet weak var defectImageHeightConstraint: NSLayoutConstraint!

    // Properties
    var delegate: ChecklistCellDelegate?

    override func awakeFromNib() {
        super.awakeFromNib()

        let longTapGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.tapEdit(sender:)))
        addGestureRecognizer(longTapGesture)
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

    }

    // Detect when the user press Long Tap on any cell
    @objc func tapEdit(sender: UITapGestureRecognizer) {
        delegate?.tapGestureOnCell(self)
    }

    // Config the cell for Defect and Damage Check
    func configCell(_ checklistItem: ChecklistItem){

        questionName.text = checklistItem.descript
        defectImageView.image = UIImage(named: String(checklistItem.imagesPath?.last ?? String()))
        vehicleCommentLabel.text = checklistItem.vehicleComment
        trailerCommentLabel.text = checklistItem.trailerComment
        tagIconImageView.image = UIImage(named: Constants.tagIcon)
    }


    // Function to change the icon when the user press Pass or Fail Btn
    func changeIconOnBtnTap(checkedBtn: UIButton, uncheckedBtn: UIButton){
        if checkedBtn.isSelected == true {
            checkedBtn.isSelected = true // user can't uncheck the button
            uncheckedBtn.isSelected = false // the unchecked button is white now
        }else {
            checkedBtn.isSelected = true
            uncheckedBtn.isSelected = false
        }
    }

    // Check if the user press Pass or Fail btn for Vehicle or Trailer
    @IBAction func passOrFailBtnTapped(_ sender: UIButton) {

        sender.isSelected = true

        delegate?.tappedOnVehicleOrTrailerButtons(vehiclePassBtn: vehiclePassButton,
                                                  vehicleFailBtn: vehicleFailButton,
                                                  trailerPassBtn: trailerPassButton,
                                                  trailerFailBtn: trailerFailButton,
                                                  selectedCell: self)
    }
}

下面是一个bug捕获:


感谢阅读。

问题在这里
点击车辆或轨道按钮

    if vehiclePassBtn.isSelected {
        item.vehiclePass = 1
    }
    if vehicleFailBtn.isSelected {
        item.vehiclePass = 2
    }
    if trailerPassBtn.isSelected {
        item.trailerPass = 1
    }
    if trailerFailBtn.isSelected {
        item.trailerPass = 2
    }
您完全依赖于按钮
isSelected
属性,该属性可以将哪个状态排入队列以更改模型值,但您应该检查当前模型值并相应地采取行动


由于发送此参数
,因此selectedCell:ChecklistCell
将其与其他方法一样使用

 let indexPath = tableView.indexPath(for:cell)!
 let itemCategory = itemSections[indexPath.section]
 let item = itemCategory.checklistItems[indexPath.row]
 // then check the value in item and go on

另一件事是不要在这里重新加载整个表

questionsTableView.reloadData()
但只有那些受影响的人

questionsTableView.reloadRows([indexPath],for:.none)

并将其放在函数的末尾

问题在这里点击鼠标或扶手按钮

    if vehiclePassBtn.isSelected {
        item.vehiclePass = 1
    }
    if vehicleFailBtn.isSelected {
        item.vehiclePass = 2
    }
    if trailerPassBtn.isSelected {
        item.trailerPass = 1
    }
    if trailerFailBtn.isSelected {
        item.trailerPass = 2
    }
您完全依赖于按钮
isSelected
属性,该属性可以将哪个状态排入队列以更改模型值,但您应该检查当前模型值并相应地采取行动


由于发送此参数
,因此selectedCell:ChecklistCell
将其与其他方法一样使用

 let indexPath = tableView.indexPath(for:cell)!
 let itemCategory = itemSections[indexPath.section]
 let item = itemCategory.checklistItems[indexPath.row]
 // then check the value in item and go on

另一件事是不要在这里重新加载整个表

questionsTableView.reloadData()
但只有那些受影响的人

questionsTableView.reloadRows([indexPath],for:.none)

并将其放在函数的末尾

如果有人想要实现相同的功能,这里有一个解决方案:

// Config the cell for Defect and Damage Check
func configCell(_ checklistItem: ChecklistItem){

    questionName.text = checklistItem.descript

    // Detect when user press Pass or Fail on any button and execute the assigned function to change the icon
    vehiclePassButton.addTarget(self, action: #selector(vehiclePassButtonTapped), for: UIControl.Event.touchUpInside)
    vehicleFailButton.addTarget(self, action: #selector(vehicleFailButtonTapped), for: UIControl.Event.touchUpInside)
    trailerPassButton.addTarget(self, action: #selector(trailerPassButtonTapped), for: UIControl.Event.touchUpInside)
    trailerFailButton.addTarget(self, action: #selector(trailerFailButtonTapped), for: UIControl.Event.touchUpInside)
}

@objc func vehiclePassButtonTapped(){
    changeIconOnBtnTap(checkedBtn: vehiclePassButton, uncheckedBtn: vehicleFailButton)
}

@objc func vehicleFailButtonTapped(){
    changeIconOnBtnTap(checkedBtn: vehicleFailButton, uncheckedBtn: vehiclePassButton)
}

@objc func trailerPassButtonTapped(){
    changeIconOnBtnTap(checkedBtn: trailerPassButton, uncheckedBtn: trailerFailButton)
}

@objc func trailerFailButtonTapped(){
    changeIconOnBtnTap(checkedBtn: trailerFailButton, uncheckedBtn: trailerPassButton)
}

// Function to change the icon when the user press Pass or Fail Btn
func changeIconOnBtnTap(checkedBtn: UIButton, uncheckedBtn: UIButton){
    if checkedBtn.isSelected{
        checkedBtn.isSelected = true // user can't uncheck the button
        uncheckedBtn.isSelected = false // the unchecked button is white now
    } else{
        checkedBtn.isSelected = false
    }
    checkedBtn.isSelected = false // reset button status
    uncheckedBtn.isSelected = false
}

谢谢Shu Khan帮助我

如果有人想要实现相同的功能,下面是修复方法:

// Config the cell for Defect and Damage Check
func configCell(_ checklistItem: ChecklistItem){

    questionName.text = checklistItem.descript

    // Detect when user press Pass or Fail on any button and execute the assigned function to change the icon
    vehiclePassButton.addTarget(self, action: #selector(vehiclePassButtonTapped), for: UIControl.Event.touchUpInside)
    vehicleFailButton.addTarget(self, action: #selector(vehicleFailButtonTapped), for: UIControl.Event.touchUpInside)
    trailerPassButton.addTarget(self, action: #selector(trailerPassButtonTapped), for: UIControl.Event.touchUpInside)
    trailerFailButton.addTarget(self, action: #selector(trailerFailButtonTapped), for: UIControl.Event.touchUpInside)
}

@objc func vehiclePassButtonTapped(){
    changeIconOnBtnTap(checkedBtn: vehiclePassButton, uncheckedBtn: vehicleFailButton)
}

@objc func vehicleFailButtonTapped(){
    changeIconOnBtnTap(checkedBtn: vehicleFailButton, uncheckedBtn: vehiclePassButton)
}

@objc func trailerPassButtonTapped(){
    changeIconOnBtnTap(checkedBtn: trailerPassButton, uncheckedBtn: trailerFailButton)
}

@objc func trailerFailButtonTapped(){
    changeIconOnBtnTap(checkedBtn: trailerFailButton, uncheckedBtn: trailerPassButton)
}

// Function to change the icon when the user press Pass or Fail Btn
func changeIconOnBtnTap(checkedBtn: UIButton, uncheckedBtn: UIButton){
    if checkedBtn.isSelected{
        checkedBtn.isSelected = true // user can't uncheck the button
        uncheckedBtn.isSelected = false // the unchecked button is white now
    } else{
        checkedBtn.isSelected = false
    }
    checkedBtn.isSelected = false // reset button status
    uncheckedBtn.isSelected = false
}

谢谢Shu Khan帮助我

请看实现UITableViewCell的prepareForReuse()方法。请看,我需要在那里实现什么?请看实现UITableViewCell的prepareforuse()方法。看到了吗?我需要在那里实现什么?我可以如何更准确地做到这一点?因为模型中的值设置正确。但是在TableView中,当我单击一个按钮时,indexPath变得疯狂,正在检查另一个按钮的临时时间段,直到我刷新ViewController几次,然后一切正常。我实现了您的解决方案,但结果完全相同。这里是一个屏幕截图:不要检查此
vehiclePassBtn.isSelected
do
项目。isSelected
,没有
isSelected
检查您的车型的实际值,而不是按钮值,我的意思是询问模型的当前状态,而不是正在排队的UI。我需要检查按下了什么按钮,以知道要为我的
项设置什么值。当我单击任何按钮时,每个
项目的值都设置正确,但问题在于显示。我将编辑文章,我将添加我的模型。也许你可以在这方面帮助我。分享一个github演示会更好,我怎样才能更准确地做到这一点?因为模型中的值设置正确。但是在TableView中,当我单击一个按钮时,indexPath变得疯狂,正在检查另一个按钮的临时时间段,直到我刷新ViewController几次,然后一切正常。我实现了您的解决方案,但结果完全相同。这里是一个屏幕截图:不要检查此
vehiclePassBtn.isSelected
do
项目。isSelected
,没有
isSelected
检查您的车型的实际值,而不是按钮值,我的意思是询问模型的当前状态,而不是正在排队的UI。我需要检查按下了什么按钮,以知道要为我的
项设置什么值。当我单击任何按钮时,每个
项目的值都设置正确,但问题在于显示。我将编辑文章,我将添加我的模型。也许你可以在这方面帮助我。分享一个github演示会更好。如果你找到了原因,那就很高兴你找到了原因