Swift CollectionView reloadData изменяет порядок на мгновение

#ios #swift

#iOS #swift

Вопрос:

У меня есть очень простой CollectionView, который показывает 4 кнопки, каждая с именем черепах. Когда я нажимаю любую кнопку, я хочу обновить свой CollectionView на случай, если мой массив увеличился и было добавлено 5-е имя, которое затем должно отображаться как 5-я кнопка. В принципе, это работает, но в тот момент, когда я нажимаю и отпускаю любую кнопку, заголовки кнопок отображают мой массив от последнего к первому, а затем переключаются обратно на первый к последнему.

Кто-нибудь знает, почему это происходит и как я могу это остановить?

Я просто хочу обновлять свой CollectionView при каждом нажатии кнопки. Если массив должен увеличиться, скажем, «Осколок», я хочу, чтобы названия кнопок оставались неизменными на первых четырех кнопках и добавлялась только 5-я кнопка.

Заранее большое вам спасибо!

 class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
    
    @IBOutlet weak var meineCV: UICollectionView!
    let cv = CollectionViewCell()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return cv.turtles.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell
        
        cell.meinButton.setTitle(cv.turtles[indexPath.row], for: .normal)
        cell.meinButton.addTarget(self, action: #selector(buttonAction(_:)), for: .touchUpInside)
        
        return cell
    }
    @IBAction func buttonAction(_ sender: UIButton) {
        print(sender.currentTitle!)
        meineCV.reloadData()
    }
}
  
 class CollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var meinButton: UIButton!
    let turtles: [String] = ["Leonardo", "Donatello", "Michelangelo", "Raphael"]
}
  

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

1. Почему turtles массив находится внутри CollectionViewCell ?

2. да, я знал, что этот вопрос возникнет 🙂 Для этого простого примера нет особой причины, по которой я не поместил его в ViewController. Но я очень сомневаюсь, что именно по этой причине мои метки кнопок меняются с last-> first, а затем сразу же возвращаются к first-> last после запуска reloadData() . Или это так?

3. Я не уверен, что происходит не так, но просто очень странно помещать источники данных turtle внутри ячейки. В каждой ячейке, которую вы удаляете из очереди, они хранят turtle s … это сбивает с толку и не нужно.

4. Я не знал, что вся «черепаха» хранится в каждой отдельной ячейке. Я только недавно начал с Swift 🙂 Спасибо, ахезе, что указал на это!

Ответ №1:

Как я понял, вы видите, что метки кнопок меняются в момент нажатия жестов, и вы хотите избавиться от этого.

Пожалуйста, попробуйте это:

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell

    let turtle = cv.turtles[indexPath.row]
    cell.meinButton.titleLabel?.text = turtle
    cell.meinButton.setTitle(turtle, for: .normal)
    cell.meinButton.addTarget(self, action: #selector(buttonAction(_:)), for: .touchUpInside)

    return cell
}
  

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

1. Это сделало это! Большое вам спасибо за вашу помощь! Мне все еще интересно, почему он меняет порядок, когда. запускается reloaddata() . Так что, если у кого-нибудь есть ответ, пожалуйста, дайте мне знать 🙂