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:)
创建它的新实例。
我的故事板中有 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:)
创建它的新实例。