集合视图的复选框无需单击即可执行操作

时间:2015-12-16 11:18:31

标签: ios swift uicollectionview swift2

我对collectionView上的复选框问题感到困惑。

我已经为'复选框'创建了一个类组件:UIbutton之后我使用了

使用'collectionview'所以当我点击某个checkbox

时出现问题

我发现另一个项目在检查之后:

如果我检查项目1的checkbox,则另一项目6已经检查。

class CheckBox: UIButton {
// Images
let checkedImage = UIImage(named: "checkbox")! as UIImage
let uncheckedImage = UIImage(named: "uncheckbox")! as UIImage

// Bool property
var isChecked: Bool = false {
    didSet{
        if isChecked == true {
            self.setImage(checkedImage, forState: .Normal)
        } else if isChecked == false {
            self.setImage(uncheckedImage, forState: .Normal)
        }
    }
}

override func awakeFromNib() {
    self.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
    self.isChecked = false
}

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

extension TrackersController: UICollectionViewDataSource, UICollectionViewDelegate {

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return dataSource.vehicles.count
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier,forIndexPath:indexPath) as! VehicleCell

     let vehicles: [Vehicle] = dataSource.vehiclesInGroup(indexPath.section)

    let vehicle = vehicles[indexPath.row]

    cell.txt_mat.text = vehicle.name
    cell.txt_imei.text = vehicle.imei
            cell.check_veh.addTarget(self, action: "selectVeh:", forControlEvents: UIControlEvents.TouchUpInside)
    cell.check_veh.tag = vehicle.id_tracker!.toInt()!
    cell.check_veh.enabled = vehicle.subscription!

    return cell
}

func selectVeh(button: CheckBox) {
    if(button.isChecked){
        vehIds.append(button.tag)
    }else if(!button.isChecked){
        var index = find(vehIds, button.tag)
        vehIds.removeAtIndex(index!)
      //  JLToast.makeText(String(button.tag)).show()

    }    
}

Image of item 1

enter image description here

Image of item 6

enter image description here

2 个答案:

答案 0 :(得分:0)

您应该将所选索引存储在一个数组中,稍后在cellForRowAtIndexPath方法中,您需要检查数组中是否已存在indexPath,或者不显示/隐藏复选框。

复选框的外观是由于重复使用单元格。每当细胞重新出现在屏幕上时,都会加载细胞的内容。因此,您需要在cellForRowAtIndex方法中相应地更新内容。

答案 1 :(得分:0)

您需要在Vehicle模态类中使用一个bool变量(例如:isSelected)并在selectVeh方法中为该bool变量设置值,如下所示

s1 = sc(s2);    // sc = string-converter