我正在研究一个项目,当我们选择某项时,其中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
})
}
}
}
答案 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