Как я должен получить данные для UICollectionViewCell из Firebase? - PullRequest
0 голосов
/ 14 мая 2019

Я новичок в Swift и Firebase, поэтому у меня есть вопрос. У меня есть модель с данными. Но мне нужно получить данные из firebase и заполнить UICollectionViewCells этими данными.

Это модель данных:

 // MARK: - Public API
var title = ""
var description = ""
var ref = Database.database().reference()

init(withSnapshot: DataSnapshot) {
    self.description = withSnapshot.childSnapshot(forPath: "description").value as? String ?? "No Description"
   // self.featuredImage = withSnapshot.childSnapshot(forPath: "image").value as? String ?? "No Image"
    self.title = withSnapshot.childSnapshot(forPath: "title").value as? String ?? "No Title"
}

var programsArrayDataSource = [TrainingProgram]()

func fetchPrograms() {
    let programsRef = self.ref.child("programs")
    programsRef.observeSingleEvent(of: .value, with: { snapshot in
        let allPrograms = snapshot.children.allObjects as! [DataSnapshot]
        for programSnap in allPrograms {
            let aProgram = TrainingProgram(withSnapshot: programSnap)
            self.programsArrayDataSource.append(aProgram)
        }

       // self.programTableView.reloadData()
    })
}

UICollectionViewCell

import UIKit

class TrainingProgramCollectionViewCell: UICollectionViewCell {



    @IBOutlet weak var roundedView: UIView!
    @IBOutlet weak var bgView: UIView!
    @IBOutlet weak var viewForImage: UIView!

    @IBOutlet weak var buttonOutlet: UIButton!


    @IBOutlet weak var featuredImageView: UIImageView!

    @IBOutlet weak var descriptionLabel: UILabel!
    @IBOutlet weak var titleLabel: UILabel!

    var trainingPrograms: TrainingProgram? {
        didSet {
            self.updateUI()
        }
    }



    private func updateUI()
    {
        if let trainingProgram = trainingPrograms {

            featuredImageView.image = trainingPrograms!.featuredImage
            titleLabel.text = trainingPrograms!.title
            descriptionLabel.text = trainingPrograms!.description

            buttonOutlet.backgroundColor = UIColor(red: 0, green: 122/255, blue: 255/255, alpha: 1)
            buttonOutlet.layer.cornerRadius = 25
            buttonOutlet.layer.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.4).cgColor
            buttonOutlet.layer.shadowOffset = CGSize(width: 0, height: 5)
            buttonOutlet.layer.shadowRadius = 15
            buttonOutlet.layer.shadowOpacity = 1
            bgView!.layer.cornerRadius = 20
            featuredImageView.roundCorners(corners: [.topLeft, .topRight], radius: 20.0)
            viewForImage.roundCorners(corners: [.topLeft, .topRight], radius: 20.0)
            roundedView.layer.cornerRadius = 20



            featuredImageView.contentMode = .scaleAspectFill

            let view = UIView(frame: featuredImageView.frame)
            view.clipsToBounds = true



            featuredImageView.clipsToBounds = true



        } else {
            featuredImageView.image = nil
            titleLabel.text = nil
            descriptionLabel.text = nil
        }


    }

    override func layoutSubviews() {
        super.layoutSubviews()

        self.layer.cornerRadius = 3.0
        layer.shadowRadius = 10
        layer.shadowOpacity = 0.2
        layer.shadowOffset = CGSize(width: 5, height: 10)

        self.clipsToBounds = false
    }

    override func prepareForReuse() {
        super.prepareForReuse()


    }

}

UIViewController

class TrainingProgramViewController: UIViewController {

@IBOutlet weak var collectionView: UICollectionView!


  //    var trainingPrograms = TrainingProgram.fetchTrainingProgram()
var trainingPrograms = [TrainingPrograms]()
    let cellScale: CGFloat = 0.7


override func viewDidLoad() {
    super.viewDidLoad()

    let screenSize = UIScreen.main.bounds.size

    collectionView.dataSource = self
    collectionView.delegate = self

    let cellWidth = floor(screenSize.width * cellScale)
    let cellHeight = floor(screenSize.height * cellScale)

    let insetX = (view.bounds.width - cellWidth) / 3.0
    let insetY = (view.bounds.height - cellHeight) / 2.0

    let layout = collectionView!.collectionViewLayout as! UICollectionViewFlowLayout
    layout.itemSize = CGSize(width: cellWidth, height: cellHeight)
    collectionView?.contentInset = UIEdgeInsets(top: insetY, left: insetX, bottom: insetY, right: insetX)

}

}

расширение TrainingProgramViewController: UICollectionViewDataSource {

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

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

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

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TrainingProgramCollectionViewCell", for: indexPath) as!  TrainingProgramCollectionViewCell
    let trainingProgram = trainingPrograms[indexPath.item]
    cell.trainingPrograms = trainingProgram

    return cell

}

}

extension TrainingProgramViewController : UIScrollViewDelegate, UICollectionViewDelegate
{
    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
    {
        let layout = self.collectionView?.collectionViewLayout as! UICollectionViewFlowLayout
        let cellWidthIncludingSpacing = layout.itemSize.width + layout.minimumLineSpacing

        var offset = targetContentOffset.pointee
        let index = (offset.x + scrollView.contentInset.left) / cellWidthIncludingSpacing
        let roundedIndex = round(index)

        offset = CGPoint(x: roundedIndex * cellWidthIncludingSpacing - scrollView.contentInset.left, y: -scrollView.contentInset.top)
        targetContentOffset.pointee = offset
    }
}

Как извлечь данные из Firebase в этот массив? Мне нужно получить две метки и одно изображение

Структура Firebase. «ссылка» - ссылка из Firebase Storage. Это пример структуры, которая будет программировать

program1
    description: 
      "Lorem"
    image: 
     "link"
    title: 
     "Workout1"
 program2
    description: 
     "Lorem"
    image: 
     "link"
    title: 
     "Workout2"

1 Ответ

0 голосов
/ 16 мая 2019

Читая комментарии, кажется, вы спрашиваете, как читать данные из Firebase.Поскольку в этом вопросе нет кода Firebase, мне приходится угадывать, чего вы в конечном итоге хотите достичь, поэтому сначала я направлю вас к Руководству Firebase Чтение и запись данных , которое охватывает эту тему.Затем см. Работа со списками

Чтобы обеспечить поддержку, вот одно из возможных решений.

Поскольку у вас есть tableView, который обычно будет поддерживаться источником данных tableView,Таким образом, концепция состоит в том, чтобы прочитать данные из Firebase и затем заполнить этот источник данных, а затем обновить tableView, который покажет объекты пользователю в пользовательском интерфейсе.

Давайте начнем с класса для хранения данных из Firebase RealtimeБаза данных

class ProgramClass {
    var description = ""
    var image = ""
    var title = ""

    init(withSnapshot: DataSnapshot) {
        self.description = withSnapshot.childSnapshot(forPath: "description").value as? String ?? "No Description"
        self.image = withSnapshot.childSnapshot(forPath: "image").value as? String ?? "No Image"
        self.title = withSnapshot.childSnapshot(forPath: "title").value as? String ?? "No Title"
    }
}

, а затем класс var для хранения этих объектов

var programsArrayDataSource = [ProgramClass]()

имейте в виду, что класс var будет выступать в качестве источника данных, который поддерживает ваше представление таблицы.Когда в firebase происходит изменение, источник данных обновляется через наблюдение Firebase (.childAdded, .childChanged или .childRemoved), а затем перезагружается tableView.

Чтобы фактически прочитать структуру Firebase, представленную в вашем вопросе, используйтеследующий кодЭто будет как чтение Firebase, так и заполнение источника данных для вашего tableView.

func fetchPrograms() {
    let programsRef = self.ref.child("programs")
    programsRef.observeSingleEvent(of: .value, with: { snapshot in
        let allPrograms = snapshot.children.allObjects as! [DataSnapshot]
        for programSnap in allPrograms {
            let aProgram = ProgramClass(withSnapshot: programSnap)
            self.programsArrayDataSource.append(aProgram)
        }

        self.programTableView.reloadData()
    })
}

Оттуда вы можете обрабатывать код tableView;когда строка нуждается в обновлении, получите этот объект из источника данных через индекс (строку), прочитайте данные из этого объекта и заполните им ячейку tableView в любом нужном формате.

...