将数据传递给 TabBarController
Pass Data to a TabBarController
对某些事情感到非常困惑,我有我的第一个视图控制器,它将允许用户输入一个词(包括通配符)并且该视图将 return 结果的表格视图,这只是一个列表与搜索匹配的词。
然后用户选择那个词,它导航到一个选项卡栏控制器,其中选项卡将是定义、同义词等。
我有一个自定义对象,我将其从第一个视图传递到 didSelectRowAt 中的选项卡栏控制器,但它不起作用。在标签栏控制器中,在 viewWillAppear 中它有对象。但是当 viewDidLoad 运行时,对象为零。
除了打印语句外,我目前在 viewDidAppear 中没有任何代码,所以我不知道它会丢失哪里
FirstViewController
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
var word: WordDetails?
word = results[indexPath.row]
let detailVC = TabBarController()
detailVC.selectedWord = word
detailVC.navigationItem.title = word?.word
tableView.deselectRow(at: indexPath, animated: true)
navigationController?.pushViewController(detailVC, animated: true)
}
TabBarController
class TabBarController: UITabBarController, UITabBarControllerDelegate {
var tabOne: UIViewController?
var tabTwo: UIViewController?
var selectedWord: WordDetails?
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
tabOne = DefinitionViewController()
let tabOneImage = UIImage.init(systemName: "book")
let tabOneBarItem = UITabBarItem(title: "Definitions", image: tabOneImage, selectedImage: tabOneImage)
tabOne?.tabBarItem = tabOneBarItem
tabTwo = SynonymViewController()
let tabTwoImage = UIImage.init(systemName: "quote.bubble")
let tabTwoBarItem = UITabBarItem(title: "Synonyms", image: tabTwoImage, selectedImage: tabTwoImage)
tabTwo?.tabBarItem = tabTwoBarItem
self.viewControllers = [tabOne!,tabTwo!]
}}
任何指导都会很棒,我确定是我误解了标签栏控制器的工作方式
更新
所以我几乎肯定误解了视图生命周期。我在 viewWillAppear 中具有价值这一事实很好。但是,如何将其传递给任何选项卡视图控制器?
我试图做这样的事情......
tabOne.selectedWord = self.selectedWord
但它错误 'UIViewController' 类型的值没有成员 'selectedWord'
我理解错了。
var selectedWord
出现在 TabBarController
class 中,不出现在 tabOne
class.
中
解法:
在 tabOne
class 中创建一个 var selectedWord
。
然后从你的 viewWillAppear
.
中赋值
希望这会奏效。如果没有,请在此处分享 tabOne
class 代码。
为什么 DefinitionViewController 和 SynonymViewController 需要 selectedWord
的另一个副本?它就在他们可以看到的 TabBarController 中。只需让他们参考
(parent as? TabBarController).selectedWord
对某些事情感到非常困惑,我有我的第一个视图控制器,它将允许用户输入一个词(包括通配符)并且该视图将 return 结果的表格视图,这只是一个列表与搜索匹配的词。 然后用户选择那个词,它导航到一个选项卡栏控制器,其中选项卡将是定义、同义词等。 我有一个自定义对象,我将其从第一个视图传递到 didSelectRowAt 中的选项卡栏控制器,但它不起作用。在标签栏控制器中,在 viewWillAppear 中它有对象。但是当 viewDidLoad 运行时,对象为零。 除了打印语句外,我目前在 viewDidAppear 中没有任何代码,所以我不知道它会丢失哪里
FirstViewController
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
var word: WordDetails?
word = results[indexPath.row]
let detailVC = TabBarController()
detailVC.selectedWord = word
detailVC.navigationItem.title = word?.word
tableView.deselectRow(at: indexPath, animated: true)
navigationController?.pushViewController(detailVC, animated: true)
}
TabBarController
class TabBarController: UITabBarController, UITabBarControllerDelegate {
var tabOne: UIViewController?
var tabTwo: UIViewController?
var selectedWord: WordDetails?
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
tabOne = DefinitionViewController()
let tabOneImage = UIImage.init(systemName: "book")
let tabOneBarItem = UITabBarItem(title: "Definitions", image: tabOneImage, selectedImage: tabOneImage)
tabOne?.tabBarItem = tabOneBarItem
tabTwo = SynonymViewController()
let tabTwoImage = UIImage.init(systemName: "quote.bubble")
let tabTwoBarItem = UITabBarItem(title: "Synonyms", image: tabTwoImage, selectedImage: tabTwoImage)
tabTwo?.tabBarItem = tabTwoBarItem
self.viewControllers = [tabOne!,tabTwo!]
}}
任何指导都会很棒,我确定是我误解了标签栏控制器的工作方式
更新
所以我几乎肯定误解了视图生命周期。我在 viewWillAppear 中具有价值这一事实很好。但是,如何将其传递给任何选项卡视图控制器?
我试图做这样的事情...... tabOne.selectedWord = self.selectedWord 但它错误 'UIViewController' 类型的值没有成员 'selectedWord'
我理解错了。
var selectedWord
出现在 TabBarController
class 中,不出现在 tabOne
class.
解法:
在 tabOne
class 中创建一个 var selectedWord
。
然后从你的 viewWillAppear
.
希望这会奏效。如果没有,请在此处分享 tabOne
class 代码。
为什么 DefinitionViewController 和 SynonymViewController 需要 selectedWord
的另一个副本?它就在他们可以看到的 TabBarController 中。只需让他们参考
(parent as? TabBarController).selectedWord