ios - Firebase - iO : How to pass data from Tableview to DetailsView?

标签 ios swift firebase firebase-realtime-database

我有一个“Feed” Controller ,它通过 Firebase 中的表格(标题和图像)列出多个帖子。

enter image description here

按一下按钮,它就会进入“提要详细信息” Controller ,我希望在其中显示先前单击的帖子(父级)中的数据(标题图像和标题)。 (见截图2)

enter image description here enter image description here

目前,在单击时,我仅获得静态信息,没有从 Firebase 获取任何信息。然而,它们都在主屏幕中被正确调用。所以问题是当它转向“DetailsController”时

如何从之前点击的项目中获取详细信息?

目前这是我的提要 Controller :

//
//  Feed.swift
//  MobileAppDemo
//
//  Created by Mikko Hilpinen on 31.10.2016.
//  Copyright © 2016 Mikkomario. All rights reserved.
//

import UIKit
import FirebaseAuth
import FirebaseDatabase
import FirebaseStorage
import SwiftKeychainWrapper
import SwiftyJSON

class FeedVC: UIViewController, UITableViewDataSource,     UIImagePickerControllerDelegate, UINavigationControllerDelegate
{
@IBOutlet weak var addImageView: UIImageView!
@IBOutlet weak var feedTableView: UITableView!
@IBOutlet weak var titleInputView: InputTextView!
@IBOutlet weak var linkbutton: UIButton!

@IBOutlet weak var captionInputView: InputTextView!


private var posts = [Post]()
private var imagePicker = UIImagePickerController()
private var imageSelected = false

private var readPosts: ObserveTask?

override func viewDidLoad()
{
    super.viewDidLoad()

    imagePicker.delegate = self
    imagePicker.allowsEditing = true

    feedTableView.dataSource = self

    feedTableView.rowHeight = UITableViewAutomaticDimension
    feedTableView.estimatedRowHeight = 320

    readPosts = Post.observeList(from: Post.parentReference.queryOrdered(byChild: Post.PROPERTY_CREATED))
    {
        posts in

        self.posts = posts.reversed()
        self.feedTableView.reloadData()
    }



}

func numberOfSections(in tableView: UITableView) -> Int
{
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return posts.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell


// here you need to add
{


    if let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as? MessageCell
    {

        let post = posts[indexPath.row]
        cell.configureCell(tableView: tableView, post: post)
        cell.linkbutton.tag = indexPath.row
        cell.linkbutton.addTarget(self, action: #selector(FeedVC.toFeedDetailAction(_:)), for: .touchUpInside)
        return cell

    }
    else
    {
        fatalError()
    }
}

func toFeedDetailAction(_ sender: UIButton) {

    let FeedDetailsController = self.storyboard?.instantiateViewController(withIdentifier: "FeedDetailsController") as! FeedDetailsController
    FeedDetailsController.post = posts[sender.tag]
    self.navigationController?.pushViewController(FeedDetailsController, animated: true)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
    if let image = info[UIImagePickerControllerEditedImage] as? UIImage
    {
        addImageView.image = image

        imageSelected = true
    }
    picker.dismiss(animated: true, completion: nil)
}

@IBAction func selectImagePressed(_ sender: AnyObject)
{
    present(imagePicker, animated: true, completion: nil)
}

@IBAction func postButtonPressed(_ sender: AnyObject)
{
    guard let caption = captionInputView.text, !caption.isEmpty else
    {
        // TODO: Inform the user
        print("POST: Caption must be entered")
        return
    }

    guard let title = titleInputView.text, !title.isEmpty else
    {
        // TODO: Inform the user
        print("POST: title must be entered")
        return
    }

    guard let image = addImageView.image, imageSelected else
    {
        print("POST: Image must be selected")
        return
    }

    guard let currentUserId = User.currentUserId else
    {
        print("POST: Can't post before logging in")
        return
    }

    imageSelected = false
    addImageView.image = UIImage(named: "add-image")
    captionInputView.text = nil
    titleInputView.text = nil

    // Uploads the image
    if let imageData = UIImageJPEGRepresentation(image, 0.2)
    {
        let imageUid = NSUUID().uuidString
        let metadata = FIRStorageMetadata()
        metadata.contentType = "image/jpeg"

        Storage.REF_POST_IMAGES.child(imageUid).put(imageData, metadata: metadata)
        {
            (metadata, error) in

            if let error = error
            {
                print("STORAGE: Failed to upload image to storage \(error)")
            }

            if let downloadURL = metadata?.downloadURL()?.absoluteString
            {
                // Caches the image for faster display
                Storage.imageCache.setObject(image, forKey: downloadURL as NSString)

                print("STORAGE: Successfully uploaded image to storage")
                _ = Post.post(caption: caption, title: title, imageUrl: downloadURL, creatorId: currentUserId)
            }
        }
    }
}

@IBAction func signOutButtonPressed(_ sender: AnyObject)
{
    // Doesn't listen to posts anymore
    readPosts?.stop()

    try! FIRAuth.auth()?.signOut()
    User.currentUserId = nil
    dismiss(animated: true, completion: nil)
}
}

以及我的 Feed 详细信息:

//
//  FeedDetails.swift
//  MobileAppDemo
//
//  Created by Mikko Hilpinen on 31.10.2016.
//  Copyright © 2016 Mikkomario. All rights reserved.
//

import UIKit
import FirebaseAuth
import FirebaseDatabase
import FirebaseStorage
import SwiftKeychainWrapper
import SwiftyJSON

class FeedDetailsController: UIViewController, UITableViewDataSource, UIImagePickerControllerDelegate, UINavigationControllerDelegate
{
@IBOutlet weak var addImageView: UIImageView!
@IBOutlet weak var feedTableView: UITableView!
@IBOutlet weak var titleInputView: InputTextView!
@IBOutlet weak var linkbutton: UIButton!

@IBOutlet weak var captionInputView: InputTextView!

var post: Post!

private var posts = [Post]()
private var imagePicker = UIImagePickerController()
private var imageSelected = false

private var readPosts: ObserveTask?

override func viewDidLoad()
{
    super.viewDidLoad()

    imagePicker.delegate = self
    imagePicker.allowsEditing = true


    readPosts = Post.observeList(from: Post.parentReference.queryOrdered(byChild: Post.PROPERTY_CREATED))
    {
        posts in

        self.posts = posts.reversed()
    }



}

func numberOfSections(in tableView: UITableView) -> Int
{
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return posts.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell


    // here you need to add
{


    if let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as? MessageCell
    {

        let post = posts[indexPath.row]
        cell.configureCell(tableView: tableView, post: post)
        cell.linkbutton.tag = indexPath.row
        cell.linkbutton.addTarget(self, action: #selector(FeedVC.toFeedDetailAction(_:)), for: .touchUpInside)
        return cell

    }
    else
    {
        fatalError()
    }
}


func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
    if let image = info[UIImagePickerControllerEditedImage] as? UIImage
    {
        addImageView.image = image

        imageSelected = true
    }
    picker.dismiss(animated: true, completion: nil)
}

@IBAction func selectImagePressed(_ sender: AnyObject)
{
    present(imagePicker, animated: true, completion: nil)
}

@IBAction func postButtonPressed(_ sender: AnyObject)
{
    guard let caption = captionInputView.text, !caption.isEmpty else
    {
        // TODO: Inform the user
        print("POST: Caption must be entered")
        return
    }

    guard let title = titleInputView.text, !title.isEmpty else
    {
        // TODO: Inform the user
        print("POST: title must be entered")
        return
    }

    guard let image = addImageView.image, imageSelected else
    {
        print("POST: Image must be selected")
        return
    }

    guard let currentUserId = User.currentUserId else
    {
        print("POST: Can't post before logging in")
        return
    }

    imageSelected = false
    addImageView.image = UIImage(named: "add-image")
    captionInputView.text = nil
    titleInputView.text = nil

    // Uploads the image
    if let imageData = UIImageJPEGRepresentation(image, 0.2)
    {
        let imageUid = NSUUID().uuidString
        let metadata = FIRStorageMetadata()
        metadata.contentType = "image/jpeg"

        Storage.REF_POST_IMAGES.child(imageUid).put(imageData, metadata: metadata)
        {
            (metadata, error) in

            if let error = error
            {
                print("STORAGE: Failed to upload image to storage \(error)")
            }

            if let downloadURL = metadata?.downloadURL()?.absoluteString
            {
                // Caches the image for faster display
                Storage.imageCache.setObject(image, forKey: downloadURL as NSString)

                print("STORAGE: Successfully uploaded image to storage")
                _ = Post.post(caption: caption, title: title, imageUrl: downloadURL, creatorId: currentUserId)
            }
        }
    }
}

@IBAction func signOutButtonPressed(_ sender: AnyObject)
{
    // Doesn't listen to posts anymore
    readPosts?.stop()

    try! FIRAuth.auth()?.signOut()
    User.currentUserId = nil
    dismiss(animated: true, completion: nil)
}
}

最佳答案

您需要在 TableView (UITableViewDelegate 方法)中实现 prepare(for:sender:) 并将需要显示的数据添加到详细 View Controller 那里。

关于ios - Firebase - iO : How to pass data from Tableview to DetailsView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42072549/

相关文章:

swift 返回 "The view hierarchy is not prepared for the constraint"

ios - 使用 Instagram API 时在哪里可以找到位置的位置 ID

android - Firebase 用户登录失败,电子邮件无效 com.google.firebase.auth 未找到

java - 用户无法注销 firebase android

ios - 如何通过滑动手势以编程方式切换 View Controller ?

ios - Objective-C ,iOS 7 - CLLocationManager : didUpdateLocations is being called only once

Swift 继承/对象结构

ios - 让当前用户删除一个 firebase child

objective-c - 停止 UIView 动画

ios - Cordova iOS 在定位远程服务器时崩溃