Добро пожаловать на SO. Это немного похоже на проблему X / Y: случай, когда вы спрашиваете о том, как реализовать конкретное (часто неоптимальное) решение, а не спрашиваете о том, как решить проблему в первую очередь.
Не следует рассматривать представления в представлении вашей коллекции как сохранение данных. (кнопки - это виды.)
Вы должны использовать кнопку, чтобы выяснить indexPath ячейки, которую коснулся пользователь, а затем просмотреть информацию в вашей модели данных.
Вам следует установить массив структур (или массив массивов, если представление вашей коллекции состоит из секций строк). Каждая из этих структур должна содержать текущие настройки для ячейки.
Ваш метод collectionView(_:cellForItemAt:)
должен использовать массив структур для настройки вашей продажи для отображения.
Когда пользователь нажимает кнопки и выбирает ячейки, вы должны обновить структуру (-ы) в соответствующем (-ых) IndexPath-ах, а затем указать представлению коллекции обновить эти ячейки.
Если вам нужно что-то сделать с выбранными ячейками, вам следует запросить в представлении коллекции массив выбранных ячеек, вы должны использовать эти IndexPath для индексации в массиве вашей модели и извлечения структуры для каждого IndexPath, а затем посмотреть данные, которые вам нужны.
EDIT:
Вы можете использовать действительно простое расширение для UICollectionView, чтобы найти indexPath любого представления внутри представления коллекции (а кнопка, как уже упоминалось, является представлением ...)
extension UICollectionView {
func indexPathForCellContaining( view: UIView) -> IndexPath? {
let viewCenter = self.convert(view.center, from: view.superview)
return self.indexPathForItem(at: viewCenter)
}
}