Swift 3 Xcode 8 Collection View Reload Data с сегментированным управлением

Я отображаю 2 набора данных из 2 разных массивов на основе выбранного индекса сегментированного элемента управления. Все работает нормально, все нужные данные загружаются. Однако происходит одна очень странная вещь:

Когда я нажимаю другую «кнопку» сегментированного элемента управления, представление коллекции должно переключаться довольно плавно (реализовано reloadData () в сегментированном элементе управления IBAction). Но перед загрузкой «правильных данных» он очень быстро мигает. Я попытался перезапустить Xcode и даже дал его другу для тестирования, однако быстрая «вспышка» осталась. Это также происходит, когда я возвращаюсь к сегментированному элементу управления button1 из сегментированного элемента управления button 2.

Когда я внимательно смотрю на то, что мигает, оказывается, что представление коллекции отображает данные из моего массива в случайном порядке (или так кажется), прежде чем быстро (очень быстро!) Переключиться обратно в свой «правильный» порядок.

Вот мой контроллер представления:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

var array1 = ["Red", "Yellow", "Purple"]
var array2 = ["Apple", "Banana", "Grape"]

@IBAction func segmentedControl(_ sender: UISegmentedControl) {
    collectionView.reloadData()
    // Reload Data
    collectionView.reloadItems(at: collectionView.indexPathsForVisibleItems)
    // Prevents 'flash' from .reloadData()
}

@IBOutlet weak var segmentedOutlet: UISegmentedControl!
// Creates an outlet for segmented control (that can be set)

@IBOutlet weak var collectionView: UICollectionView!

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    switch segmentedOutlet.selectedSegmentIndex {
    case 0 : return array1.count
    case 1 : return array2.count
    default: return 0
    }
}

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

    switch segmentedOutlet.selectedSegmentIndex {
    case 0 : cell.button.setTitle(array1[indexPath.row], for: .normal)
    case 1 : cell.button.setTitle(array2[indexPath.row], for: .normal)
    default : break
    }
    return cell
}

person MTsiang    schedule 16.06.2017    source источник
comment
вы должны показать свой код для более подробной информации.   -  person Sour LeangChhean    schedule 16.06.2017
comment
Я бы попытался поставить точку останова в ваших методах источника данных, чтобы действительно увидеть, что происходит. Кажется, в ваших данных может быть промежуточное состояние?   -  person Adam Campbell    schedule 16.06.2017
comment
@AdamCampbell: да, это отличная идея, также решил ее, поместив кнопку `` тест '', чтобы поэкспериментировать с комбинациями .reloadData (), например, только для определенных путей и разделов индекса и т. Д.   -  person MTsiang    schedule 16.06.2017


Ответы (1)


Хорошо, я нашел способ обойти это. В основном после:

collectionView.reloadData ()

Добавить

collectionView.reloadItems (по адресу: collectionView.indexPathsForVisibleItems)

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

person MTsiang    schedule 16.06.2017