Передайте данные Firebase в DetailView с помощью CollectionViewCell _Swift - PullRequest
0 голосов
/ 23 апреля 2019

Я использую базу данных 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)
            }
        }
    }

1 Ответ

0 голосов
/ 23 апреля 2019

Можно попробовать

performSegue(withIdentifier: "showRecipeDetails", sender: recipes[indexPath.item])

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showRecipeDetails" {
        let destination = segue.destination as! RecipeDetailViewController 
        destination.selectedRecipe = sender as! Recipe 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...