- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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 结构。 “link”- 来自 Firebase 存储的链接。这是一个将进行编程的结构示例
program1
description:
"Lorem"
image:
"link"
title:
"Workout1"
program2
description:
"Lorem"
image:
"link"
title:
"Workout2"
最佳答案
通读评论,您似乎在询问如何从 Firebase 读取数据。由于问题中没有 Firebase 代码,我不得不猜测您最终想要完成什么,因此我首先将您引导至 Firebase 指南 Reading and Writing Data因为这涵盖了主题。然后,参见Working With Lists
为了提供帮助,这里有一个可能的解决方案。
由于您有一个 tableView,因此通常由 tableView 数据源支持。因此,其概念是从 Firebase 读取数据,然后填充该数据源,然后刷新 tableView,这将在 UI 中向用户显示对象。
让我们从一个类来保存 Firebase 实时数据库中的数据
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 programsArrayDataSource = [ProgramClass]()
请记住,类 var 将充当支持 TableView 的数据源。当 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 单元格。
关于swift - 我应该如何从 Firebase 检索数据到 UICollectionViewCell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56130894/
堆栈:Mac OS 10.15.6,Xcode 版本 12.0 (12A7209) 我有一个自行调整大小的收集单元。我覆盖 preferredLayoutAttributesFitting获得自我调整
我有一个 Storyboard,它是在 Xcode 6 中创建的,带有 Collection View ,并且单元格具有不同的大小类变化,例如不同的字体大小......( Storyboard中创建的
我有一个 UICollectionView,只有 1 个部分,该部分中有许多单元格。我启用了拖放行为(使用长按手势识别器,因为 UICollectionView 位于通用 UIViewControll
按照我的老问题here : How to add UIView inside a UITableViewCell Programmatically? 我想通过在这些 collectionViewCel
我将 UICollectionViewCell 与父 UICollectionViewCell 中的按钮一起使用: protocol DayCellDelegate { func button
例如,我有 10 个单元格的 UICollectionView。我想为选定的单元格添加边框,稍后,在选择另一个单元格时,想要删除以前的边框并为新的选定单元格添加边框。 我怎样才能做到这一点? 我已经试
我有一个 UICollectionViewCell(比如 UICollectionViewCell 1),单元格内有一个按钮和 UITextfields。连接到 (ViewController 1)
我在单个 UICollectionViewCell 内有 (3) UITextViews、(1) UITextField 和 (1) UILabel >。当文本换行到第二行时,在符合 UITextVi
我对 TableVieCell 中的 collectionView 有疑问。当我点击 collectionCell 时,didSelectItemAt 不会被调用。我在 collectionCell
我最近在我的 Storyboard中添加了一个 UICollectionView,它当前被另一个 View 插入 View ,这似乎工作正常但是,使用 Storyboard编辑器我将 View 设置为
我想在 UICollectionViewCell 上开始一些动画当用户点击一个单元格时。我的想法是在 didSelectItemAtIndexPath 中选择相应的单元格并触发动画。但是,这不起作用:
我可以通过使用手势识别器拖动它并简化新的 iOS 9 对重新排序的支持来重新排序 iOS 9 上的 UICollectionViewCells。 public func beginInteractiv
我正在开发一个应用程序,其中我在 UICollectionView 中实现了编辑模式。我正在尝试实现如下所示的内容: 当我单击编辑按钮时,相机按钮和眼睛按钮应隐藏,删除和重命名按钮应如下所示: 编辑后
我希望所有单元格之间以及屏幕边框和最近的单元格之间的间距相等。基本上是这样的。内部和周围的间距相等。 我设法通过设置这样的值在界面生成器中测试这一点。我将单元格大小设置为 110,最小间距设置为 0,
我已经设置了一个 UICollectionView,如下所示。我正在尝试设置自定义单元格高度,以便该集合在必须滚动之前适合屏幕上的 3 个单元格。但是,这种定制工作不起作用或似乎被忽略了。有谁知道我做
我在不使用 Storyboard的情况下以编程方式创建了 UICollectionView 和 UICollectionViewCell,但是发生了一些事情,我无法理解为什么。 BKPhotoCell
我正在寻找制作图片库。我希望我的图像全屏显示,但不确定这如何与自动布局一起使用。我知道有一种方法可以返回单元格的大小,但不知道我是否应该只获取屏幕大小并返回它,或者是否有使用自动布局的方法。 最佳答案
我有一个问题, 我有一个简单的 UICollectionView,其中包含从 Flickr 加载图像的静态 200 个单元格。 我的 CellForItemAtIndexPath 看起来像这样: -
以下代码是一个非常简单的程序,用于在 UICollectionView 中显示 1-10000 之间的数字。 .它在不滚动的情况下正确显示,但是如果您向下滚动并向后滚动 Collection View
这个问题在这里已经有了答案: UICollectionViewLayout Not working with UIImage in Swift 5 and Xcode 11 (2 个答案) 关闭 2
我是一名优秀的程序员,十分优秀!