0

I'm working on a project, where Initial View has a PickerView, when we select something. I'm passing this data as a String to TabBarController and then from the TabBarController to every 5 of his "childrens".

To this moment everything works fine.

Now, by clicking a TableViewCell I want to pass data from one of TabBarController's children (ViewController) to a non-TabBarController View (FullNewsViewController) and show this View. I try few methods and nothing works. Can you help me?

I'm working on Swift 5 and Xcode 10.2.

This is my View Controller from which I want to download the "FinalTeam":

import UIKit
import FirebaseDatabase

class ViewController: UIViewController, UITableViewDelegate, 
     UITableViewDataSource {

@IBOutlet weak var imageView: UIImageView!
var ref: DatabaseReference?
var refHandle: DatabaseHandle?
var news = [String]()
var FinalTeam = ""

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var infoLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    let tabbar = tabBarController as! TabBarViewController
    var FinalTeam = tabbar.Team
   // infoLabel.text = String(describing: tabbar.Team)
    infoLabel.text = FinalTeam
    tableView.delegate = self
    tableView.dataSource = self
    ref = Database.database().reference()
    switch FinalTeam {
    case "Lech Poznań":
        imageView.image = UIImage(named: "leszek")
        refHandle = ref?.child("News/Lech/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)
                self.tableView.reloadData()
            }
        })
    case "Legia Warszawa":
        imageView.image = UIImage(named: "legia")
        refHandle = ref?.child("News/Legia/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })
    case "Lechia Gdańsk":
        imageView.image = UIImage(named: "lechia")
        refHandle = ref?.child("News/Lechia/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })
    case "Wisła Płock":
        imageView.image = UIImage(named: "wisla_p")
        refHandle = ref?.child("News/Wisła_P/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })
    case "Wisła Kraków":
        imageView.image = UIImage(named: "wisla_k")
        refHandle = ref?.child("News/Wisła_K/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })
    case "Jagiellonia Białystok":
        imageView.image = UIImage(named: "jaga")
        refHandle = ref?.child("News/Jaga/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })
    case "Piast Gliwice":
        imageView.image = UIImage(named: "piast")
        refHandle = ref?.child("News/Piast/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })
    case "Pogoń Szczecin":
        imageView.image = UIImage(named: "pogon")
        refHandle = ref?.child("News/Pogoń/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })
    case "Korona Kielce":
        imageView.image = UIImage(named: "korona")
        refHandle = ref?.child("News/Korona/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })
    case "Cracovia":
        imageView.image = UIImage(named: "cracovia")
        refHandle = ref?.child("News/Cracovia/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })
    case "Śląsk Wrocław":
        imageView.image = UIImage(named: "slask")
        refHandle = ref?.child("News/Śląsk/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })
    case "Miedź Legnica":
        imageView.image = UIImage(named: "miedz")
        refHandle = ref?.child("News/Miedź/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })
    case "Zagłębie Sosnowiec":
        imageView.image = UIImage(named: "zaglebie_s")
        refHandle = ref?.child("News/Zagłębie_S/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })
    case "Zagłębie Lubin":
        imageView.image = UIImage(named: "zaglebie_l")
        refHandle = ref?.child("News/Zagłębie_L/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })
    case "Górnik Zabrze":
        imageView.image = UIImage(named: "gornik")
        refHandle = ref?.child("News/Górnik/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })
    case "Arka Gdynia":
        imageView.image = UIImage(named: "arka")
        refHandle = ref?.child("News/Arka/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })

    default:
        imageView.image = UIImage(named: "lech")
        refHandle = ref?.child("News/Lech/Naglowek").observe(.value, with: { (snapshot) in
            let post = snapshot.value as? String
            if let actualPost = post {
                self.news.append(actualPost)

                self.tableView.reloadData()
            }
        })
    }
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return news.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "newsCell")
    cell?.textLabel?.text = news[indexPath.row]
    return cell!
}

}

This is my FullNewsViewController where I want to send this data:

import UIKit
import FirebaseDatabase

class FullNewsViewController: UIViewController,UITextViewDelegate {


@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var contentTextView: UITextView!
@IBAction func button(_ sender: Any) {
    navigationController?.popViewController(animated: true)
    dismiss(animated: true, completion: nil)
}

var ref: DatabaseReference?
var refHandleTitle: DatabaseHandle?
var refHandleContent: DatabaseHandle?
var news = [String]()
var FinalTeam = ""

override func viewDidLoad() {
    super.viewDidLoad()
    ref = Database.database().reference()
    contentTextView.delegate = self

    switch FinalTeam {
    case "Lech Poznań":
        //imageView.image = UIImage(named: "leszek")
        refHandleTitle = ref?.child("News/Lech/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Lech/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    case "Legia Warszawa":
        //imageView.image = UIImage(named: "legia")
        refHandleTitle = ref?.child("News/Legia/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Legia/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    case "Lechia Gdańsk":
        //imageView.image = UIImage(named: "lechia")
        refHandleTitle = ref?.child("News/Lechia/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Lechia/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    case "Wisła Płock":
        //imageView.image = UIImage(named: "wisla_p")
        refHandleTitle = ref?.child("News/Wisła_P/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Wisła_P/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    case "Wisła Kraków":
        //imageView.image = UIImage(named: "wisla_k")
        refHandleTitle = ref?.child("News/Wisła_K/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Wisła_K/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    case "Jagiellonia Białystok":
        //imageView.image = UIImage(named: "jaga")
        refHandleTitle = ref?.child("News/Jaga/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Jaga/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    case "Piast Gliwice":
       // imageView.image = UIImage(named: "piast")
        refHandleTitle = ref?.child("News/Piast/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Piast/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    case "Pogoń Szczecin":
       // imageView.image = UIImage(named: "pogon")
        refHandleTitle = ref?.child("News/Pogoń/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Pogoń/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    case "Korona Kielce":
       // imageView.image = UIImage(named: "korona")
        refHandleTitle = ref?.child("News/Korona/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Korona/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    case "Cracovia":
        //imageView.image = UIImage(named: "cracovia")
        refHandleTitle = ref?.child("News/Cracovia/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Cracovia/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    case "Śląsk Wrocław":
       // imageView.image = UIImage(named: "slask")
        refHandleTitle = ref?.child("News/Śląsk/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Śląsk/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    case "Miedź Legnica":
       // imageView.image = UIImage(named: "miedz")
        refHandleTitle = ref?.child("News/Miedź/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Miedź/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    case "Zagłębie Sosnowiec":
       // imageView.image = UIImage(named: "zaglebie_s")
        refHandleTitle = ref?.child("News/Zagłębie_S/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Zagłębie_S/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    case "Zagłębie Lubin":
       // imageView.image = UIImage(named: "zaglebie_l")
        refHandleTitle = ref?.child("News/Zagłębie_L/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Zagłębie_L/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    case "Górnik Zabrze":
       // imageView.image = UIImage(named: "gornik")
        refHandleTitle = ref?.child("News/Górnik/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Górnik/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    case "Arka Gdynia":
      //  imageView.image = UIImage(named: "arka")
        refHandleTitle = ref?.child("News/Arka/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Arka/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })

    default:
      //  imageView.image = UIImage(named: "lech")
        refHandleTitle = ref?.child("News/Lech/Naglowek").observe(.value, with: { (snapshot) in
            let titlePost = snapshot.value as? String
            if let actualTitlePost = titlePost {
                self.news.append(actualTitlePost)
            }
            self.titleLabel.text = titlePost
        })
        refHandleContent = ref?.child("News/Lech/Tresc").observe(.value, with: { (snapshot) in
            let contentPost = snapshot.value as? String
            if let actualContentPost = contentPost {
                self.news.append(actualContentPost)
            }
            self.contentTextView.text = contentPost
        })
    }
}

}

This is my Storyboard

  • "I try few methods and nothing works" What are those methods? Show them. – El Tomato Apr 03 '19 at 12:13
  • Hi Sebastian, welcome to SO. It would be great if you post what you have tried so far so that we can help you with your approach. There are many ways to do what you requested, so better to have more context. – Aks Apr 03 '19 at 12:14
  • Can you elaborate more? it's really hard to understand your question. you can post your code and some screen shots of your storyboard for the further explanation. – Aqeel Ahmad Apr 03 '19 at 12:17
  • I tried a "prepare(for segue:)" with different types of segues, "navigationController.pushViewController()" and making this View a next TabBarViewController. Always there is a crash or nothing is sended and I have empty String. – Sebastian Niestój Apr 03 '19 at 12:25
  • you can use segue. Here is the tutorial for the usage of segue https://www.youtube.com/watch?v=f5UGhwiixY4&list=PLU1p-3ZpKfpmWsAFhQ00r7DC13M24UnSC&index=5&t=7s – Aqeel Ahmad Apr 03 '19 at 12:27
  • Use `NotificationCenter` or wrapper -> https://github.com/cesarferreira/SwiftEventBus – SPatel Apr 03 '19 at 12:40

2 Answers2

0

We would need to know relation between your "child" view controller and your "non-TabBarController" to give which way is the appropriate one.

In general there are a few procedures and they depend on the situation. First is to forward the data. It is usually used when you create a new screen and want to pass data from the previous screen:

private func showUsersViewController(_ users: [User]) {
    let controller = UIStoryboard(name: "User", bundle: nil).instantiateViewController(withIdentifier: "UserListViewController") as! UserListViewController
    controller.users = users
    present(controller, animated: true, completion: nil)
    // navigationController?.pushViewController(controller, animated: true)
}

But if you want to get the information back, for instance in the above case when a user is pressed you will do something on this screen, you would use delegates.

private func showUsersViewController(_ users: [User]) {
    let controller = UIStoryboard(name: "User", bundle: nil).instantiateViewController(withIdentifier: "UserListViewController") as! UserListViewController
    controller.users = users
    controller.delegate = self
    present(controller, animated: true, completion: nil)
    // navigationController?.pushViewController(controller, animated: true)
}

and in the user list controller

protocol UserListViewControllerDelegate: class {
    func userListViewController(_ sender: UserListViewController, didSelectUser user: User)
}

class UserListViewController: UIViewController, UITableViewDelegate {

    weak var delegate: UserListViewControllerDelegate?

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        delegate?.userListViewController(self, didSelectUser: users[indexPath.row])
    }

}

Then back in your main view controller

extension ViewController: UserListViewControllerDelegate {

    func userListViewController(_ sender: UserListViewController, didSelectUser user: User) {
        self.user = user
        self.reloadUI()
    }

}

So in this case you have 2 view controllers at the same time which can communicate between each other in both directions.

These 2 procedures are generally enough to solve pretty much any communication between two view controllers. But there are other ways like using selectors, using notifications, MVVM...

Matic Oblak
  • 16,318
  • 3
  • 24
  • 43
0

Without using delegates:- Define a data object at TargetViewController and assign value at TabBarController.

let storyboard = UIStoryboard(name: "QpayRegistartion", bundle: nil)

    func routeToTargetViewController(){
      let targetViewControllerObj = storyboard..instantiateViewController(withIdentifier:storyBoardIdentifiersVC) as! TargetViewController
    targetViewControllerObj.dataObject = value //Its your data object to pass.
    self.vc.navigateToViewController(targetViewControllerObj)
    }

For segue from storyboard:-

//Pass data in prepareForSegue method like this:-
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// From your TabBar's ViewController.
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    let destinationVC = segue.destinationViewController as FullNewsViewController
destinationVC.FinalTeam = self.FinalTeam

    }

For more clarification :- CheckThis

Ravi Sharma
  • 975
  • 11
  • 29