Представление UIcollection аварийно завершает работу при изменении количества элементов в источнике данных

 self.collectionView.delegate = self
        self.collectionView.dataSource = self
        self.collectionView.isPrefetchingEnabled = false

        self.collectionView.layer.shadowColor = UIColor.black.cgColor
        self.collectionView.layer.shadowOffset = CGSize(width: -1, height: 1)//CGSizeMake(0, 1)
        self.collectionView.layer.shadowOpacity = 0.5
        self.collectionView.layer.shadowRadius = 3.0
        self.collectionView.clipsToBounds = false
        self.collectionView.layer.masksToBounds = false

это то, что я сделал с представлением коллекции в didLoad

теперь проблема в том, что когда я устанавливаю свой массив источников данных, скажем,

var myDataSource:[Custom Model] = []

когда я меняю myDataSourceArray, он изначально имеет 10 значений после изменений, этот массив теперь получил только 1 значение, когда я перезагружаю представление коллекции, он дает это ...

*** Assertion failure in -[UICollectionViewData validateLayoutInRect:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3698.54.4/UICollectionViewData.m:435
2018-10-29 12:28:27.884302+0500 MyBetterDealsv2[14203:147469] Task <A3EE0E68-F980-47FD-A5B2-941C1D233A34>.<7> finished with error - code: -1001
2018-10-29 12:28:27.904908+0500 MyBetterDealsv2[14203:145748] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView received layout attributes for a cell with an index path that does not exist: <NSIndexPath: 0xc000000000200016> {length = 2, path = 0 - 1}'

Я также пробовал аннулировать макет, но он дает ту же ошибку, еще не получил решения :(

ниже приведены мои методы делегата для collectionview

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}
// tell the collection view how many cells to make
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    if (self.myallDeals != nil && self.myallDeals?.count != 0){
        self.collectionViewHeightConstraint.constant = 220
    }
    return self.myallDeals?.count ?? 0

}

// make a cell for each cell index path
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    // get a reference to our storyboard cell
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "dealCell", for: indexPath ) as! DealsCell
    let cellData = self.myallDeals?[indexPath.row]
    cell.dealTitle.text = cellData?.dealTitle
    cell.dealDescription.text = cellData?.dealLocation
    cell.discount.text = "$\(cellData?.discountedPrice ?? "") now"
    cell.dealDistanceLabel.text = "\(cellData?.distance ?? 0.0) km away"
    cell.ratingView.rating = cellData?.averageRating ?? 0.0

    cell.dealImage.sd_setImage(with: URL(string: cellData?.dealPicture ?? ""), placeholderImage: nil)
    if (cellData?.isliked == true){
        cell.likeButton.backgroundColor = UIColor(red: 251/255, green: 106/255, blue: 74/255, alpha: 1.0)
        cell.likeButton.setImage(UIImage(named: "liked"), for: .normal)
    }else{
         cell.likeButton.backgroundColor = UIColor(red:255, green: 255, blue:255, alpha: 1.0)
        cell.likeButton.setImage(UIImage(named: "heart"), for: .normal)
    }

    //===========================
    return cell
}


    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            // handle tap event
            if (Constants.isGuestUser){
                self.present(Utilities.SelectionButtonActionSheet(), animated: true, completion: nil)
            }else{
                let deal = self.myallDeals?[indexPath.row]
                //dealdetail
                let vc = self.storyboard?.instantiateViewController(withIdentifier: "dealdetail") as! DealDetailVC
                vc.mydeal = deal
                Utilities.animationOnPush(sender: self, nxtVC: vc)
                print("You selected cell.")
            }

        }

Представление UIcollection аварийно завершает работу при изменении количества элементов в источнике данных

это оригинальная ячейка

это то, что я получил с помощью сатиш-кода

Представление UIcollection аварийно завершает работу при изменении количества элементов в источнике данных

Настроен ли макет вашего collectionView?

Sateesh Yemireddi 29.10.2018 08:42

Можете ли вы опубликовать свои методы делегатов?

nikhilgohil11 29.10.2018 08:42

@Sateesh no, я использую поток из раскадровки, просто никакие настройки не применяются

junaid 29.10.2018 08:52

@ nikhilgohil11 да, конечно

junaid 29.10.2018 08:53

@ nikhilgohil11 только что обновил вопрос с методами делегата, пожалуйста, посмотрите

junaid 29.10.2018 08:57
UICollectionView использует IndexPath с item вместо row. Вы используете row в let cellData = self.myallDeals?[indexPath.row]
Ricky Mo 29.10.2018 09:04

при первом запуске он отлично работает, когда я меняю массив alldeals, он вылетает.

junaid 29.10.2018 09:05

@RickyMo, я просто попробовал элемент вместо строки, он вызывает такой же сбой

junaid 29.10.2018 09:07

Можете ли вы показать строки, где вы меняете данные, перезагружаете и вылетаете?

Ricky Mo 29.10.2018 09:13

@RickyMo self.myallDeals = allDeals var myallDeals: [Deal]? {DidSet {self.collectionView.reloadData ()}} вот как я меняю и перезагружаю

junaid 29.10.2018 09:14

Пытался перезагрузить данные в основном потоке. var myallDeals: [Сделка]? {didSet {DispatchQueue.main.async {self.collectionView.reloadData ()}}}

Sateesh Yemireddi 29.10.2018 09:47

@Sateesh проблема в том, что, если количество массива больше или равно предыдущему, оно работает нормально, если новое количество меньше предыдущего, оно вылетает с указанной выше ошибкой

junaid 29.10.2018 10:18

@Sateesh такой же сбой с основной очередью :(

junaid 29.10.2018 10:21

Попробуйте сбросить макет: let layout = UICollectionViewFlowLayout () layout.scrollDirection = //.horizontal или .vertical collectionView? .CollectionViewLayout = layout

Sateesh Yemireddi 29.10.2018 10:23

@junaid где вы меняете массив dataSource?

VDPurohit 29.10.2018 10:25

@VDPurohit сначала я получаю сделки в соответствии с моим текущим местоположением, когда пользователь рисует маршрут, я меняю массив dataSource

junaid 29.10.2018 10:28

@Sateesh решил проблему, но ячейки не такие, как я спроектировал в раскадровке; (

junaid 29.10.2018 10:29

@junaid, не могли бы вы загрузить изображение, которое вы получили после добавления кода Сатиша, а перед ним, что именно вы хотите?

VDPurohit 29.10.2018 10:33

@VDPurohit Я просто добавляю изображения, см.

junaid 29.10.2018 10:43

спасибо, @junaid Я видел принятый ответ ниже. Рад, что вы нашли решение.

nikhilgohil11 30.10.2018 02:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
20
467
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я надеюсь это поможет тебе

let layOut = UICollectionViewFlowLayout()
layOut.layout.scrollDirection = //.horizontal or .vertical
self.collectionView?.collectionViewLayout = layOut

И используйте ниже метод делегата "UICollectionViewDelegateFlowLayout"

extension yourViewController : UICollectionViewDelegateFlowLayout {

     func collectionView(_ collectionView: UICollectionView,
                layout collectionViewLayout: UICollectionViewLayout,
                sizeForItemAt indexPath: IndexPath) -> CGSize {
        // your code here
        //width and height as per your requirement
        return CGSize(width: self.view.frame,size.width - 24, height: height)
    }
}

Другие вопросы по теме