在我的应用程序中,我有一个开关,我希望它成为保存图像的指示器。现在我只有一个保存所有图像的按钮。
通过示例
更有意义我尝试了什么:
func saveTapped() {
let cell = collectionView?.cellForItem(at: indexPath) as! CustomCell
for image in images where cell.savingSwitch.isOn {
...
但我无法访问indexPath。我应该如何调用此Save方法来访问collectionView中的特定行?或者还有另一种方式吗?
答案 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
}
}