【问题标题】:Checkbox of collection view take a action without clicking集合视图的复选框无需单击即可执行操作
【发布时间】:2015-12-16 11:18:30
【问题描述】:

我对@9​​87654327@上的复选框问题感到非常困惑。

我已经为“复选框”创建了一个类组件: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

Image of item 6

【问题讨论】:

  • 你如何区分不同的按钮?按标签?按索引路径?这在您的原始帖子中根本不清楚。
  • 你好,通过 cellForItemAtIndexPath 方法上的标签我将 id 车辆 id_tracker(int) 并为我的按钮创建了一个目标,用于将我的标签按钮的 id 放入整数列表中,这很清楚?

标签: ios swift uicollectionview swift2


【解决方案1】:

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

复选框的出现是由于对单元格的重用。每次单元格重新出现在屏幕上时,都会加载单元格的内容。所以你需要在cellForRowAtIndex方法中相应地更新内容。

【讨论】:

    【解决方案2】:

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

     func selectVeh(button: UIButton) {
          button.selected = !button.selected
          let vehicle:Vehicle = vehicles[button.tag]
          vehicle.isSelected = button.selected;
          vehicles.replaceObjectAtIndex(button.tag, withObject: vehicle)
      }
    in cellForItemAtIndexPath add below code
    cell.check_veh.selected =  vehicle.isSelected
    

    【讨论】:

    • 谢谢,但我已经创建了一个列表 ID 并将其放在标签按钮上的行 ID 中,有什么不同?并且列表做了另一件事,但现在这个“cellForItemAtIndexPath”方法我认为它可以是解决方案,所以我创建了一个方法,我正在做另一个检查,但不幸的是没有任何改变:/
    • @MrMehdi 您正在更改 isChecked 的值
    • 我创建了一个类 CheckBox: UIButton 就像每个复选框组件一样!
    • @MrMehdi 那么您需要更改 cellForItemAtIndexPath 方法中的代码 cell.check_veh.selected = vehIds.containObject(indexpAth.row)
    • 谢谢,但我已经这样做了:func collectionView(collectionView: UICollectionView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier,forIndexPath:indexPath) as! VehicleCell println("IN") if !contains(vehIds,cell.check_veh.tag) { cell.check_veh.isChecked = false } return cell } 但我仍然遇到问题:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多