swift - 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 中的视图
如何解决,请告诉我?
解决方案
您的方法有一些问题。
如果您想从controller1
to转到TableViewController3
但导航堆栈包含controller1 -> TableViewController2 -> TableViewController3
,则必须先让按钮在没有动画的controller1
情况TableViewController2
下推送,然后TableViewController3
再用动画推送。(您将无法让您的按钮触发转场。)
第二个问题:你不能通过TableViewController2
调用它的初始化程序(TableViewController2()
)来创建你的副本。当您这样做时,它不会从情节提要中加载其视图。相反,您应该为其分配故事板标识符并使用该UIStoryboard
方法instantiateViewController(withIdentifier:)
创建它的新实例。
推荐阅读
- oracle - Oracle JDBC Resultset.getString("COLUMN_DEF") 返回小写引号字符串
- configuration - 在 kube-apiserver 中设置功能门 RuntimeClass
- reactjs - 如何从我的示例中使 React 组件看起来更具可读性和简洁性?
- excel - Excel:计算员工一周内一起工作的频率?
- regex - 正则表达式:文件名中的否定模式
- java - 从 MYSQL 获取基于用户 ID 的数据并显示在 android studio 的 recyclerview 中
- java - 需要一个找不到的“org.springframework.mail.javamail.JavaMailSender”类型的bean,但给出了配置
- php - 显示没有 css 和 js 的索引页面
- android - Android App Link verify 一直不起作用
- php - 哪一个是最好和更快的方法?(制作下拉方法)