如何将数据从TabBarController视图之一传递到non-TabBarController视图?

时间:2019-04-03 12:07:15

标签: ios swift

我正在研究一个项目,当我们选择某项时,其中Initial View有一个PickerView。我将这些数据作为String传递给TabBarController,然后从TabBarController传递给他的“孩子”的每5个。

到目前为止,一切正常。

现在,通过单击TableViewCell,我想将数据从TabBarController's子级(ViewController之一)传递到非TabBarController视图(FullNewsViewController)并显示视图。我尝试了几种方法,但没有任何效果。你能帮我吗?

我正在开发Swift 5和Xcode 10.2。

这是我的View Controller,我要从中下载“ 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!
}

}

这是我要在其中发送此数据的FullNewsViewController:

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

2 个答案:

答案 0 :(得分:0)

我们需要知道您的“子”视图控制器与“ non-TabBarController”之间的关系,以给出哪种方法是合适的。

通常有一些程序,它们取决于情况。首先是转发数据。通常在创建新屏幕并希望从上一个屏幕传递数据时使用:

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)
}

但是,如果您想找回信息,例如,在上述情况下,当按下用户时,您将在此屏幕上执行某些操作,那么您将使用委托。

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)
}

并在用户列表控制器中

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])
    }

}

然后返回主视图控制器

extension ViewController: UserListViewControllerDelegate {

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

}

因此,在这种情况下,您同时拥有2个视图控制器,它们可以在两个方向之间相互通信。

这两个过程通常足以解决两个视图控制器之间的几乎所有通信。但是还有其他方法,例如使用选择器,使用通知,MVVM ...

答案 1 :(得分:0)

不使用委托: 在TargetViewController定义一个数据对象,并在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)
    }

对于情节提要中的segue:-

//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

    }

更多说明:-CheckThis