Reputation:
I have a collection view that displays a grid of images. It allows a user to select up to three images to email to themselves. When a user taps on a cell(image) it highlights yellow and the filename is added to an array, if they tap it again it deselects, the highlight is removed and the image is removed from the array.
Once the user sends the email I use the MFMailComposeResult delegate to remove items from the array but I can't figure out how to remove the yellow highlights from the cells. Hoping someone might be able to help. THANKS.
I'm adding the filenames of the images in the didSelectItemAt and didDeselectItemAt functions.
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let fileName = filenames[indexPath.item]
selectedFileNames.append(fileName)
}
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
let fileName = filenames[indexPath.item]
if let index = selectedFileNames.index(of: fileName) {
selectedFileNames.remove(at: index)
}
}
and I'm highlighting the cells in my UICollectionViewCell class
override var isSelected: Bool {
didSet {
self.layer.borderWidth = 3.0
self.layer.borderColor = isSelected ? UIColor.yellow.cgColor : UIColor.clear.cgColor
}
}
Once the email is sent here is the code using the delegate
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
controller.dismiss(animated: true)
if result == MFMailComposeResult.sent {
print("emailed Photos")
self.selectedFileNames.removeAll()
self.fullSizeSharableImages.removeAll()
}
}
Any idea how to clear the highlighted cells?
Upvotes: 2
Views: 5910
Reputation: 31
Less elegant solution than tomahh, but you can call
collectionView.allowsSelection = false
collectionView.allowsSelection = true
and it will clear the selection
Upvotes: 1
Reputation: 13651
You'll want, for each selected index path, to call deselectItem(at indexPath: IndexPath, animated: Bool)
on the collection view.
Fortunatelly, UICollectionView
has a property that lists the selected index paths. So, in mailComposeController(_: didFinishWith:)
, you can write:
collectionView.indexPathsForSelectedItems?
.forEach { self.collectionView.deselectItem(at: $0, animated: false) }
Upvotes: 12