将数据从侧边菜单传递回其原始View Controller

时间:2018-08-09 09:40:22

标签: ios swift

我有一个带有两个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
    }

1 个答案:

答案 0 :(得分:0)

您应该在父视图控制器的变量中(例如在CountryDetailsVC中存储对tableView(:didSelectRowAt:)的引用,而不是在CountryDetailsVC中创建prepare(for:sender:)的新实例。嵌入segue,然后稍后在该变量上调用函数。