Просто получите город из массива townName на основе тега кнопки, установленного в представлении коллекции, и вызывается ли ваш метод действия? если его вызов ниже будет работать
@objc func selectedAction(sender: UIButton) {
let currentCellNumber = sender.tag
if button.isSelected {
button.isSelected = false
button.backgroundColor = greenCTAColor
print("User unselected cell number: \(currentCellNumber!)")
} else {
button.isSelected = true
button.backgroundColor = blueCTAColor
print("User selected cell number: \(currentCellNumber!)")
}
let town = townName[currentCellNumber]
print(town.name)
}
В cellForItemAt
добавить действие к кнопке для этой ячейки
cell.button.addTarget(self, action: #selector(selectedAction), for: .touchUpInside)
Я всегда создаю кнопку и действие в классе collectionViewCell, а затем использую делегат patten для передачи данных. но так как вы создали действие в том же контроллере, приведенном выше, оно будет работать, так как для действия установлено значение self, оно будет вызывать selectedAction.