iOS + Firebase - отправка данных из контроллера вида в контроллер детального просмотра - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть ViewController, где список данных выбирается из RealtimeDatabase и отображается в UITableView. При нажатии на сообщение я хочу, чтобы данные из ViewController, такие как Заголовок, Описание и Изображение, были перенесены в DetailView, т. Е. PostController.Swift, где я могу дополнительно вызывать дополнительные данные из RealtimeDatabase для отображения в PostController.Swift

Я пытался использовать didSelectRowAt, но не смог получить и отобразить данные в PostController, я также в настоящее время пытаюсь использовать приготовление, но застрял в том же месте.

Вот это ViewController.Swift:

import UIKit
import Firebase
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var tableView:UITableView!

    var posts = [Post]()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        tableView = UITableView(frame: view.bounds, style: .plain)
        view.addSubview(tableView)

        let cellNib = UINib(nibName: "PostTableViewCell", bundle: nil)
        tableView.register(cellNib, forCellReuseIdentifier: "postCell")
        var layoutGuide:UILayoutGuide!

        layoutGuide = view.safeAreaLayoutGuide

        tableView.leadingAnchor.constraint(equalTo: layoutGuide.leadingAnchor).isActive = true
        tableView.topAnchor.constraint(equalTo: layoutGuide.topAnchor).isActive = true
        tableView.trailingAnchor.constraint(equalTo: layoutGuide.trailingAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: layoutGuide.bottomAnchor).isActive = true

        tableView.delegate = self
        tableView.dataSource = self
        tableView.tableFooterView = UIView()
        tableView.reloadData()

        observePosts()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func observePosts() {
        let postsRef = Database.database().reference().child("Data")

        postsRef.observe(.value, with: { snapshot in
            var tempPosts = [Post]()

            for child in snapshot.children{

                if let childSnapshot = child as? DataSnapshot,
                    let dict = childSnapshot.value as? [String:Any],
                    let title = dict["title"] as? String,
                    let logoImage = dict["image"] as? String,
                    let url = URL(string:logoImage),
                    let description = dict["description"] as? String{


                    let userProfile = UserProfile(title: title, photoURL: url)
                    let post = Post(id: childSnapshot.key, title: userProfile, description: description, image: userProfile)
                    print(post)
                    tempPosts.append(post)
                }
            }

            self.posts = tempPosts
            self.tableView.reloadData()
        })
    }

    func getImage(url: String, completion: @escaping (UIImage?) -> ()) {
        URLSession.shared.dataTask(with: URL(string: url)!) { data, response, error in
            if error == nil {
                completion(UIImage(data: data!)) 
            } else {
                completion(nil)
            }
            }.resume()
    }

    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{
        let cell = tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostTableViewCell
        cell.set(post: posts[indexPath.row])
        return cell
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        tableView.estimatedRowHeight = 50
        return UITableViewAutomaticDimension
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "PostDetailSegue" {


            if let indexPaths = self.tableView!.indexPathForSelectedRow{

            }

        }
    }
}

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Вам необходимо сохранить ссылку на Post в вашем DetailViewController.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "PostDetailSegue" {
        let detailViewController = segue.destinationViewController as! DetailViewController
        let indexPath = tableView.indexPathForSelectedRow
        let post = posts[indexPath.row]
        detailViewController.setPost(post)

    }
}

А в вашем DetailViewController:

func detailViewController.setPost(_ post: Post) {
    // Store the post and fetch other data as necessary
    self.post = post
}
0 голосов
/ 05 ноября 2018

попробуйте это.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
 let postsInfo = posts[indexPath.row]
 print(postsInfo)
 performSegueWithIdentifier("PostDetailSegue", sender: self)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "PostDetailSegue" {
        if let indexPaths = posts[indexPath.row]{
     //add parmaters which passed to another viewcontroller   
     }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...