Данные не будут заполнять представление прокрутки UICollectionView - PullRequest
0 голосов
/ 17 января 2020

Я новичок в этом вопросе, поэтому, пожалуйста, go Полегче!

Моя проблема заключается в следующем:

Я пытаюсь заполнить представление прокрутки (UICollectionView) данными из firebase.

Я уверен, что он успешно извлекает данные, поскольку я могу распечатать данные, используя для l oop в конце функции firebase.

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

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

Мне также указали, что мой источник данных - «self.pages». Как передать данные, полученные из firebase, в методы делегата?

Fatal error: Index out of range

Вот мой код:

//arrays of names and descriptions which are populated in firebase() function
    var names:[String] = []
    var descriptions: [String] = []

Класс страницы:

 let imageName: UIImage
 let headerText: String
 let bodyText: String 

Вот viewDidLoad

override func viewDidLoad() {
        super.viewDidLoad()

        firebase()
        setupImages()
    }

Вот функция настройки изображения:

 func setupImages(){

        self.pages = [
            Page(imageName: self.image, headerText: names[0], bodyText: descriptions[0]),

            Page(imageName: self.image, headerText: names[1], bodyText: descriptions[1]),

            Page(imageName: self.image, headerText: names[2], bodyText: descriptions[2]),

            Page(imageName: self.image, headerText: names[3], bodyText: descriptions[3]),

            Page(imageName: self.image, headerText: names[4], bodyText: descriptions[4]),
        ]

        self.collectionView?.backgroundColor = .white
        self.collectionView?.register(PageCell.self, forCellWithReuseIdentifier: "cellId")
        self.collectionView?.isPagingEnabled = true
    }

Я думаю, что проблема вызвана тем, что данные из базы данных не были получены достаточно быстро.

Я говорю это, потому что у меня есть другая функция в другом классе, которая, кажется, устанавливает ее:

override init(frame: CGRect) {
        super.init(frame: frame)
        //setup layout sets up constraints for the layout of the page
        setupLayout()
    }

Добавление метода UICollectionViewDataSource:

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return pages.count
    }

и:

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

        let page = pages[indexPath.item]
        cell.page = page
        return cell
    }

Метод поиска Firebase:

func firebase()
    {
        //connection to firebase for the names and descriptions
        let db = Firestore.firestore()
        db.collection(restaurauntName).getDocuments { (snapshot, err) in

            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in snapshot!.documents {
                    let name = document.get("Name") as! String
                    let description = document.get("Description") as! String
                    //Add names and descriptions to the arrays
                    self.names.append(name)
                    self.descriptions.append(description)
                }
            }

            for x in self.names{
                print(x)
            }

        }
    }

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

Ответы [ 2 ]

1 голос
/ 23 января 2020

Вот проблема, и ваше предположение верно; код не передается в правильном порядке.

override func viewDidLoad() {
   super.viewDidLoad()

   firebase()
   setupImages()
}

Firebase является асинхронным, и ваше приложение должно быть структурировано таким образом, чтобы вы пытались работать только с данными Firebase в замыкании после вызова. В вашей функции viewDidLoad вы вызываете firebase () для загрузки данных, но функция setupImages будет фактически выполняться до того, как Firebase успеет получить данные с сервера.

К счастью, это простое исправление. Вот новые функции с некоторыми обновленными именами, чтобы сделать поток более ясным первый 5. Аналогичным образом, если имеется 3 документа, приложение выполнит взлом sh, так как эта функция будет пытаться получить доступ к объектам с индексами 3, 4, и они не будут существовать.

0 голосов
/ 17 января 2020

Просмотр вашего кода: вы используете self.pages в качестве источника данных. Я не вижу соединения с Firebase в коде, который вы здесь предоставили.

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

cell.page = page

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

...