Я новичок в этом вопросе, поэтому, пожалуйста, 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)
}
}
}
Спасибо за чтение, любой способ, который может направить меня в правильном направлении, будет оценен!