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

How to bind Switch state to an object in Swift?

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

举个例子更有意义

我尝试过的:

func saveTapped() {

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

for image in images where cell.savingSwitch.isOn  {

...

但我无法访问 indexPath。我应该如何调用此 Save 方法以访问我的 collectionView 中的特定行?或者有别的办法吗?

首先,您需要一种方法来将 "save" 设置与 table 中的每个图像一起存储,例如通过将图像和标志保存在结构中:

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

并在 table 视图的数据源中使用 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 { [=12=].save }
}

在您的 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
   }
}