Я использую базу данных Firebase, чтобы хранить там свои данные.Я могу успешно сохранить все элементы и в основном могу видеть их в консоли базы данных.Я также могу заполнить ячейку collectionView сохраненными данными.
Единственная проблема заключается в том, что я не могу успешно передать данные в детальный просмотр.
Я посмотрел на другое приложение iOS, в котором я выполняю поискот просмотра таблицы до успешного просмотра контроллера, но не смог заставить его работать с collectionView в этом новом приложении.
Это контроллер представления, который получает данные из базы данных Firebase. наблюдаем Рецепты () функция выводит данные в консоли.
class RecipesViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
@IBOutlet weak var recipesCollectionView: UICollectionView!
var ref: DatabaseReference!
var recipes = [Recipe]()
override func viewDidLoad() {
super.viewDidLoad()
recipesCollectionView.delegate = self
recipesCollectionView.dataSource = self
observeRecipes()
IHProgressHUD.showImage(UIImage(named:"disabled")!, status: "Loading")
}
func observeRecipes() {
let ref = Database.database().reference(withPath: "recipes")
ref.observe(.value, with: { snapshot in
print(snapshot.value as Any)
var newRecipes: [Recipe] = []
for child in snapshot.children {
if let childSnapshot = child as? DataSnapshot,
let dict = childSnapshot.value as? [String:Any],
let showTitle = dict["RecipeName"] as? String,
let showTime = dict["RecipeTime"] as? String,
let recipeImage = dict["RecipePhoto"] as? String,
let ingridients = dict["Ingridients"] as? String,
let firstImageViewURL = dict["imageOne"] as? String,
let firstIngridients = dict["firstIngridientList"] as? String,
let firstInstructions = dict["firstInstructionList"] as? String,
let secondImageViewURL = dict["imageTwo"] as? String,
let secondIngridients = dict["secondIngridientList"] as? String,
let secondInstructions = dict["secondInstructionList"] as? String,
let thirdImageViewURL = dict["imageThird"] as? String,
let thirdIngridients = dict["thirdIngridientList"] as? String,
let thirdInstructions = dict["thirdInstructionList"] as? String,
let url = URL(string:recipeImage),
let urlFirst = URL(string: firstImageViewURL),
let urlSecond = URL(string: secondImageViewURL),
let urlThird = URL(string: thirdImageViewURL) {
let recipe = Recipe(title: showTitle, time: showTime, recipeImageURL: url, ingridients: ingridients, firstImageViewURL: urlFirst, firstIngridients: firstIngridients, firstInstructions: firstInstructions, secondImageViewURL: urlSecond, secondIngridients: secondIngridients, secondInstructions: secondInstructions, thirdImageViewURL: urlThird, thirdIngridients: thirdIngridients, thirdInstructions: thirdInstructions)
newRecipes.append(recipe)
}
}
self.recipes = newRecipes
self.recipesCollectionView.reloadData()
})
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return recipes.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let recipeCell = collectionView.dequeueReusableCell(withReuseIdentifier: "recipeCell", for: indexPath) as! RecipeCollectionViewCell
recipeCell.set(cell: recipes[indexPath.row])
return recipeCell
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showRecipeDetails" {
let destination = segue.destination as! RecipeDetailViewController
destination.selectedRecipe = sender as! Recipe
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = recipesCollectionView.cellForItem(at: indexPath) as! RecipeCollectionViewCell
performSegue(withIdentifier: "showRecipeDetails", sender: cell)
// performSegue(withIdentifier: "showRecipeDetails", sender: indexPath)
}
}
}
Это detailViewController
class RecipeDetailViewController: UIViewController, UIScrollViewDelegate {
var recipes = [Recipe]()
var ref: DatabaseReference?
var selectedRecipe: Recipe?
// Recipe Details
@IBOutlet weak var recipeTitleLabel: UILabel!
@IBOutlet weak var recipeTimeLabel: UILabel!
@IBOutlet weak var recipeImageView: UIImageView!
@IBOutlet weak var ingridientsLabel: UILabel!
//General Outlets & Variables
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var closeButtonView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegate = self
recipeTitleLabel.text = selectedRecipe?.title
}
Ниже приведен код, который я использовал дляprepareForSegue в моем другом приложении, которое работает нормально.Я пытался настроить это, чтобы вписаться в collectionView, но почему-то я не могу заставить его работать.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetails" {
let destination = segue.destination as! StoryDetailsViewController
if let indexPath = self.tableView.indexPathForSelectedRow {
destination.selectedStory = self.posts[indexPath.row]
print(indexPath.row)
}
}
}