collectionView загружает XIB вместо содержимого из массива в Swift - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть представление коллекции, которое должно отображать массив элементов из объекта, загруженного из firebase.Однако, когда приложение загружается впервые, оно просто отображает XIB без загруженного контента (иногда контент загружается, а иногда нет).Только когда я добавляю новый элемент в массив и перезагружаю представление коллекции, содержимое загружается в представление.Вот как выглядит приложение при первом открытии.Представление коллекции просто показывает xib collection view not loaded, однако после добавления нового элемента представление коллекции выглядит так, как должно collection view as it should look Мой вопрос заключается в том, как мне убедиться, чтопредставление коллекции всегда загружается перед отображением выгруженного xib?Спасибо.

методы:

var currentUser: User!
var listCategories: [String] = ["Friends Lists", "Friends", "People"]
var lists = [Media]()

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return listCategories.count
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    if section == 0 {

        return lists.count

    }else{
        return 0
    }

}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Storyboard.listCell, for: indexPath) as! ListCell

    cell.currentUser = currentUser
    cell.media = lists[indexPath.item]
    cell.layer.applySketchShadow(color: UIColor.black, alpha: 0.08, x: 0, y: 0, blur: 10, spread: 0)
    cell.layer.cornerRadius = 20
    cell.layer.masksToBounds = false

    return cell

}

//section header view
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView
{
    let sectionHeaderView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: Storyboard.sectionHeader, for: indexPath) as! SectionHeaderView
    let category = listCategories[indexPath.section]
    sectionHeaderView.sectionTitle = category
    return sectionHeaderView
}

Следующий метод, который вызывается в viewWillAppear

func fetchMedia() {
    Media.observeNewMedia { (media) in
        if !self.lists.contains(media) {
            self.lists.insert(media, at: 0)
            self.collectionView.reloadData()
        }
    }
}

Внутри класса Media

class func observeNewMedia(_ completion: @escaping (Media) -> Void)
{

    WADatabaseReference.media.reference().observe(.childAdded) { (snapshot) in
        let media = Media(dictionary: snapshot.value as! [String : Any])
        completion(media)
    }

}

inside collectionViewCell

import UIKit

import Foundation import SAMCache

class ListCell: UICollectionViewCell {

@IBOutlet weak var nameView: UIView!
@IBOutlet weak var mainView: UIView!

@IBOutlet weak var nameButton: UIButton!
@IBOutlet weak var profileImageView: UIImageView!
@IBOutlet weak var dateLabel: UILabel!
@IBOutlet weak var listTitle: UILabel!
@IBOutlet weak var boughtLabel: UILabel!
@IBOutlet weak var boughtProgress: UIProgressView!

var numOfItems = 0
var numOfBought = 0
var counter: Double = 0{
    didSet{

        boughtProgress.isHidden = false
        let fractionalProgress = Float(counter)
        boughtProgress.setProgress(fractionalProgress, animated: true)

    }
}
var currentUser: User!
var media: Media! {
    didSet{
        if currentUser != nil{
            self.updateUI()
        }
    }
}

var cache = SAMCache.shared()

func updateUI(){

    let profileImageKey = "\(media.createdBy.uid)-profileImage"
    if let image = cache?.object(forKey: profileImageKey) as? UIImage {

        self.profileImageView.image = image

    }else{
        media.createdBy.downloadProfilePicture { [weak self] (image, error) in
            if let image = image {

                self?.profileImageView.image = image
                self?.cache?.setObject(image, forKey: profileImageKey)

            }else if error != nil {

                print(error)
            }
        }
    }


    mainView.layer.cornerRadius = 20
    mainView.layer.masksToBounds = true

    //profile image

    profileImageView.layer.cornerRadius = profileImageView.bounds.height / 2.0
    profileImageView.layer.masksToBounds = true

    //name

    nameButton.setTitle("\(media.createdBy.firstName) \(media.createdBy.lastName)", for: [])
    nameView.layer.cornerRadius = 20
    nameView.layer.masksToBounds = true

    //date

    dateLabel.text = "\(convertDateFormatter(theDate: media.dueAt))"
    dateLabel.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.3)
    dateLabel.textColor = UIColor.white
    dateLabel.layer.cornerRadius = dateLabel.bounds.height / 2.0
    dateLabel.layer.masksToBounds = true

    //title

    listTitle.text = "\(media.title)"

    //progress

    numOfItems = media.items.count
    print("num of items \(media.items.count)")
    counter = Double(numOfBought)/Double(numOfItems)
    boughtLabel.text = "\(numOfBought)/\(numOfItems) Bought"
    boughtProgress.layer.cornerRadius = boughtProgress.bounds.height / 2.0
    boughtProgress.layer.masksToBounds = true

}

@IBAction func arrowDidTap(){

    print("arrow tapped")

}

func convertDateFormatter(theDate: String) -> String
{
    print(theDate)
    let newFormat = DateFormatter()
    newFormat.dateFormat = "dd/MM/yyyy"
    let dueDate = newFormat.date(from: theDate)
    newFormat.dateFormat = "dd MMM yy"
    print(newFormat.string(from: dueDate!))
    return  newFormat.string(from: dueDate!)

}

func getColourFromTag(tag: String) -> [CGColor] {

    if tag == "Christmas" {

        return [Colours.gradients.festive.start.cgColor, Colours.gradients.festive.end.cgColor]

    }else if tag == "Birthday" {

        return [Colours.gradients.lime.start.cgColor, Colours.gradients.lime.end.cgColor]

    }else if tag == "Valentines Day" {

        return [Colours.gradients.strawberry.start.cgColor, Colours.gradients.strawberry.end.cgColor]

    }else if tag == "Charity" {

        return [Colours.gradients.blueberry.start.cgColor, Colours.gradients.blueberry.end.cgColor]

    }else if tag == "Event" {

        return [Colours.gradients.fire.start.cgColor, Colours.gradients.fire.end.cgColor]

    }else{
        return [Colours.gradients.midnight.start.cgColor, Colours.gradients.midnight.end.cgColor]
    }
}

}

1 Ответ

0 голосов
/ 03 декабря 2018

По крайней мере, теперь мне кажется, что вы не перезагружаете свой collectionView с пустыми данными, а просто загружаете то, что находится внутри .xib-файла.Попробуйте collectionView.reloadData() в viewDidLoad или что-то еще, когда ваш массив еще пуст, чтобы избежать этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...