如何将Swile状态绑定到Swift中的对象?

时间:2018-04-15 08:39:00

标签: swift uiswitch collectionview

在我的应用程序中,我有一个开关,我希望它成为保存图像的指示器。现在我只有一个保存所有图像的按钮。

enter image description here

通过示例

更有意义

我尝试了什么:

func saveTapped() {

let cell = collectionView?.cellForItem(at: indexPath) as! CustomCell

for image in images where cell.savingSwitch.isOn  {

...

但我无法访问indexPath。我应该如何调用此Save方法来访问collectionView中的特定行?或者还有另一种方式吗?

2 个答案:

答案 0 :(得分:1)

首先,您需要一种方法将“保存”设置存储在表格中的每个图像旁边,例如将图像和标志保存在结构中:

struct TableEntry {
   let image: UIImage
   var save = false
}

并在tableview的数据源中使用var images: [TableEntry]

然后,您可以使用每个UISwitch的tag属性来存储它所在的行,例如在

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(...)
    cell.switch.tag = indexPath.row
    cell.switch.isOn = self.images[indexPath.row].save
    cell.imageView.image = self.images[indexPath.row].image
    return cell
}

然后在切换值更改时调用的方法中使用标记,以了解所引用的图像:

@IBAction func switchChanged(_ sender: UISwitch) {
    self.images[sender.tag].save = sender.isOn
}

func saveTapped() {
    let imagesToSave = self.images.filter { $0.save }
}

答案 1 :(得分:1)

CustomCell中,您可以添加一个在switch状态发生变化时触发的闭包,

class CustomCell: UITableViewCell {

   var onSwitchStateChange: ((Bool) -> Void)?

   @IBAction func switchTapped(_ sender: UISwitch) {
       self.onSwitchStateChange?(sender.isOn)
   }
}

然后您可以更新cellForRowAt,如下所示

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

   cell.onSwitchStateChange = { state in
     guard state else { return }

     let image = images[indexPath.row]
     // Upload Image
   }
}