Swift UICollectionView обновляет метку ячейки при нажатии, не обновляя в режиме реального времени

#ios #swift #uicollectionview #reloaddata

#iOS #swift #uicollectionview #reloaddata

Вопрос:

Я уже некоторое время пытаюсь выяснить, как оперативно обновлять uicollectionview.

Я пытался использовать несколько различных методов, чтобы сделать это, используя reloadData, reloadItems и reloadSections. Используя как DispatchQueue.main.async, так и нет.

Я не могу понять, как довести это до такой степени, чтобы, когда пользователь выбирает одну из ячеек, обновлять содержимое этой ячейки в режиме реального времени перед пользователем. В частности, выделите текст метки жирным шрифтом, а не жирным шрифтом, в зависимости от щелчков по ячейке.

Вот метка, которую я настроил в swift:

 let nameLabel: UILabel = {
    let label = UILabel()
    label.text = ""
    return label
}()
  

Вот didselectitem для collectionview

 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath) as! FilterCollectionViewCell
    let selected = ViewController.brands[indexPath.item]
    if FilterLauncher.selectedOptions.contains(selected){
        let loc = FilterLauncher.selectedOptions.firstIndex(of: selected)
        FilterLauncher.selectedOptions.remove(at: loc!)
        cell.nameLabel.font = UIFont.boldSystemFont(ofSize: 2.0)
        DispatchQueue.main.async {
            collectionView.reloadItems(at: [indexPath])
        }
    }
    else{
        FilterLauncher.selectedOptions.append(selected)
        cell.nameLabel.font = UIFont.boldSystemFont(ofSize: 15.0)
        DispatchQueue.main.async{
             self.collectionView.reloadItems(at: [indexPath])}

    }
}
  

В конечном итоге текст выбранной ячейки выделяется жирным шрифтом, но это происходит с задержкой. Мне приходится пытаться выбрать другую ячейку, когда ячейка, которую я пытался выделить первым жирным шрифтом. Когда я выбираю ячейку в первый раз, она отображает нужные мне изменения, но затем возвращается обратно.

Просмотр коллекции выберите ячейку, измените текст, пример

Ответ №1:

Я не думаю, что вам нужно вызывать collectionView.reloadItems(at: [indexPath]) после его выбора. Прямой доступ к метке ячейки должен вносить изменения без необходимости перезагрузки ячейки.

Я предполагаю, что у вас есть некоторый код удаления из очереди в cellForItemAt , который устанавливает обычный шрифт, поэтому, когда вы нажимаете на ячейку, ее метка выделяется жирным шрифтом, но затем сразу же возвращается к нормальному значению при перезагрузке.

Комментарии:

1. Когда я удаляю reloadItems, при выборе ячейки она не выделяется жирным шрифтом, пока я не коснусь другого места на экране. Вот почему я подумал, что мне нужно как-то обновить, чтобы показать новые настройки. Это не будет выделено жирным шрифтом, я просто сижу после нажатия на ячейку. Это то, что у меня есть для cellForItemAt пусть list_item = ViewController.brands[indexPath.item] cell.list_item = list_item возвращает ячейку

2. @flaskpiao это странно. Поможет ли это, если вы поместите этот код внутрь willSelectItemAt или shouldHighlightItemAtIndexPath вместо этого?