首页 > 解决方案 > Xcode 无法返回导航堆栈中的 TableViewController

问题描述

我的故事板中有 controller1 -> TableViewController2 -> TableViewController3。当我按下控制器 1 中的按钮时,我想跳转到 TableViewController3,当我选择一行时,我想从那里返回到 TableViewController2 并获取一些数据,然后返回到控制器 1。

在 controller1 中实例化 TableViewController3:

if segue.identifier == "MySegue" {
     let viewController:TableViewController3 = segue.destination as! TableViewController3
     viewController.addLocationToMap = true
}
    

在 TableViewController3 中像这样实例化 TableViewController2:

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      if addLocationToMap == true {
        let navc:UINavigationController = self.navigationController!
        let tvc:UITableViewController = TableViewController2()
        let rootView = navc.viewControllers[0]
        navc.setViewControllers([rootView, tvc], animated: true)
       return
    }

在 TableViewController2 viewDidLoad 中,当我尝试设置文本字段值时,它在 ViewDidLoad 中失败,因为文本字段为零。不可能是因为 Textfield 已经在视图中。看起来 TableViewController2 视图从未被加载。

在 TableViewController2

override func viewDidLoad() {
        super.viewDidLoad()
locationPurposeTextField.text = "sometext"
}

设置文本值时失败,因为 locationPurposeTextField 为 nil。

如何解决这个问题?

编辑:按下控制器1中的按钮时:

let navc:UINavigationController = self.navigationController!
        let alTvc = self.storyboard!.instantiateViewController(withIdentifier: "AddLocationID") as! UITableViewController
        navc.pushViewController(alTvc, animated: false)
        let cListTvc = self.storyboard!.instantiateViewController(withIdentifier: "ContactListID") as! UITableViewController
        navc.pushViewController(cListTvc, animated: true)

该代码将我带到 TableViewController3,并根据需要使用情节提要 ID:ContactListID。

接下来,在 TableViewController3

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.myDelegate?.userSelectedContact(contactIdentifier: self.contactId, contactFullName: fullName, contactSelected: true)
            let navc:UINavigationController = self.navigationController!
            let tvc:UITableViewController = self.storyboard!.instantiateViewController(withIdentifier: "AddLocationID") as! UITableViewController
            let rootView = navc.viewControllers[0]
            navc.setViewControllers([rootView, tvc], animated: true)
}

带我到 TableViewController2,故事板 ID:AddLocationID 基于发送的委托 TableViewController3,在 TableViewController2 的 ViewDidappear 方法中,我在视图中设置了一些文本并调用 tableview.realoadData()。它不加载视图。

但是,如果我在 TableViewController2 中选择一个按钮并加载 TableViewController3,然后在执行完全相同的方法 didSelectRow 时返回到 TableViewController2,它会重新加载 TableViewController2 中的视图

如何解决,请告诉我?

标签: swiftxcodestoryboard

解决方案


您的方法有一些问题。

如果您想从controller1to转到TableViewController3但导航堆栈包含controller1 -> TableViewController2 -> TableViewController3,则必须先让按钮在没有动画的controller1 情况TableViewController2下推送,然后TableViewController3再用动画推送。(您将无法让您的按钮触发转场。)

第二个问题:你不能通过TableViewController2调用它的初始化程序(TableViewController2())来创建你的副本。当您这样做时,它不会从情节提要中加载其视图。相反,您应该为其分配故事板标识符并使​​用该UIStoryboard方法instantiateViewController(withIdentifier:)创建它的新实例。


推荐阅读