DidSelect подсветка с изменением цвета не работает - PullRequest
1 голос
/ 20 октября 2019

У меня есть одно представление коллекции, где в каждой ячейке у меня есть одно представление фона. Таким образом, всякий раз, когда пользователь выбирает какую-либо ячейку, цвет фона конкретного вида ячейки будет меняться.

Но теперь проблема в том, что цвет его фона меняется ... но если я выберу другую ячейку, цвет фона предыдущего выбранного ячейки должен измениться на нормальный цвет. Этого не происходит.

фоновый цвет предыдущего представления ячейки также остается выбранным.

- вот мой виртуальный канал didselectmethod:

let cell = chartCollectionView.cellForItem(at: indexPath) as? UserDataVC
var data = [String: Any]()
data["selectedCell"] = true
cell?.set(dataSource: data)

ячейка моей коллекции:

class userCell: CollectionViewCell {

   override func set(data: [String : AnyObject]) {

  if let selectedCell = data["selectedCell"] as? Bool {
            if selectedCell { 
                mainView.backgroundColor = UIColor.red
            }
        }

     }
}

Любое решение будетбыть полезным

Ответы [ 2 ]

0 голосов
/ 20 октября 2019

Ваша текущая реализация очень плохая.
Я бы посоветовал сохранить индекс выделенной ячейки как свойство и получить к нему доступ, чтобы выделять или не выделять, когда он отключается. Например:

// Your CollectionView Delegate class
var currentHighlightedCellIndex: Int?

Затем в вашем collectionView(_:cellForItemAt:):

// Dequeue the cell
... 

if let selectedIndex = self.currentHighlightedCellIndex, selectedIndex == indexPath.row {
    cell.selectedCell = true
} else {
    cell.selectedCell = false 
}

// Return the cell
...

В вашем collectionView(_:didSelectItemAt:):

guard let cell = collectionView.cellForItem(at: indexPath) as? YourCustomCellClass else { fatalError() }

cell.selectedCell = true
if let previouslySelectedIndex = self.currentHighlightedCellIndex {
    // Here we get the index paths for each visible cell and check wether it's selected.
    let indexPaths = collectionView.visibleCells.compactMap { collectionView.indexPath(for: $0) }
    for index in (indexPaths.map { $0.item }) {
        if index == previouslySelectedIndex {
            // We found a cell that is highlighted and visible, get it in deselect it.
            guard let cell = collectionView.cellForItem(at: IndexPath(item: index, section: 0)) else { fatalError() }
            cell.selectedCell = false
        }
    }
}

self.currentHighlightedCellIndex = indexPath.item

Вы можете установить наблюдаемое свойство вкласс ячейки вашей пользовательской коллекции, который будет управлять цветом фона, например:

// Custom cell class
var selectedCell: Bool = false {
    didSet {
        self.mainView.backgroundColor = selectedCell ? .red : .white
    }
}
0 голосов
/ 20 октября 2019

Что такое mainView?
Как правило, вы должны изменить либо contentView ячейки, либо присвоить backgroundView и selectedBackgroundView ячейке.
Кроме того, немного не связанного с этим, я бы использовал другой методдля изменения содержимого в ответ на события:
Я бы никогда не изменил ячейку напрямую, просто опустив ее.
Вместо этого я бы изменил данные, которые я использую для инициализации ячеек, а затем перезагрузил бы ячейки, которые я хочу изменить,и затем воссоздайте (на самом деле, это, вероятно, будет повторно использовано) ячейки по мере необходимости, используя collectionView(_:cellForItemAt:).
Таким образом, вам никогда не нужно понижать число.

...