我有一个带有两个ViewController
的“国家” ContainerViews
:侧面菜单(TocVC
)和数据屏幕(CountryDetailsVC
)。控制侧边菜单切换的按钮位于导航栏中。
侧边菜单有一个TableView
,在didSelectRowAt indexPath
上,我想将其String
的值传递回数据屏幕,并将其分配给它的Label
。
这是我尝试过的:
TocVC
:
var selectedItem:String = ""
...
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedItem = contents[indexPath.row]
let VC = CountryDetailsVC()
VC.labelUpdate(dataFrom: selectedItem)
}
CountryDetailsVC
:
@IBOutlet weak var label: UILabel!
...
func labelUpdate(dataFrom: String) {
self.label.text = dataFrom
}
但是据我了解,我得到Fatal error: Unexpectedly found nil while unwrapping an Optional value
是因为TocVC
传递了数据,但是CountryDetailsVC
并未“刷新”自身并运行该函数。
做我想做的事的正确方法是什么?
编辑:情节提要截图 Storyboard
EDIT1:更新了代码。
Country
:
let detailsVc = CountryDetailsVC()
TocVC
:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedItem = contents[indexPath.row]
Country().detailsVc.labelUpdate(dataFrom: selectedItem)
CountryDetailsVC
:
@IBOutlet weak var label: UILabel!
func labelUpdate(dataFrom: String) {
print("dataFrom: \(dataFrom)")
self.label.text = dataFrom
}
该函数将dataFrom
字符串输出到控制台,但是在尝试将dataFrom
分配给label.text
的下一行崩溃。
当我将label: UILabel!
更改为label: UILabel?
时,它不会崩溃,但也不会更改文本。
也许与this similar situation有关?
EDIT2:更新了代码。在self
中引用TocVC
。仍然不起作用。
Country
:
let detailsVc = CountryDetailsVC()
...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue .destination is TocVC {
let vc = segue.destination as? TocVC
vc?.countryVC = self
}
}
TocVC
:
var countryVC: Country?
...
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedItem = contents[indexPath.row]
Country().detailsVc.labelUpdate(dataFrom: selectedItem)
CountryDetailsVC
:
@IBOutlet weak var label: UILabel!
func labelUpdate(dataFrom: String) {
print("dataFrom: \(dataFrom)")
self.label.text = dataFrom
}
答案 0 :(得分:0)
您应该在父视图控制器的变量中(例如在CountryDetailsVC
中存储对tableView(:didSelectRowAt:)
的引用,而不是在CountryDetailsVC
中创建prepare(for:sender:)
的新实例。嵌入segue,然后稍后在该变量上调用函数。