Xcode 无法返回到导航堆栈中的 TableViewController

Xcode Cannot go back to TableViewController in navigation stack

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

在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 失败,因为文本字段为 nil。不可能是因为 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)
}

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

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

如何解决,请告诉我?

您的方法有几个问题。

如果你想从 controller1 转到 TableViewController3 但你的导航堆栈包含 controller1 -> TableViewController2 -> TableViewController3,你必须先让 controller1 中的按钮按下 TableViewController2 没有动画,然后按下 TableViewController3 有动画。 (您将无法让您的按钮触发 segue。)

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