我正在构建一个简单的应用程序。 1个视图控制器中的项目列表,包含表格视图和嵌入式导航控制器。当您选择一行时,它会将您带到详细信息屏幕(没问题)。
从列表视图推送到列表项
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "ListItemDetailsVC", sender: nil)
}
从列表项弹回到列表视图
@IBAction func backToInboxTapped(_ sender: Any) {
navigationController?.popToRootViewController(animated: true)
}
这很好用!
我的问题是我有另一个视图控制器(添加项目),在单击添加按钮时以模态方式显示。这个想法是,当它保存时,它会带你进入列表细节vc。
@IBAction func saveItem(_ sender: Any) {
performSegue(withIdentifier: "DetailsFromAdd", sender: nil)
}
从添加新控制器打开详细信息视图控制器工作正常,但是一旦打开详细信息视图,我希望能够返回到rootViewController。该按钮不再起作用
答案 0 :(得分:2)
在您的情况下,您不需要使用segue。你必须清除一些概念。
如果您从popToRootViewController
推送或显示视图控制器,则无法VC
或modally presented vc
现在,如果你想实现这个目标,那么你必须做一些我想在下面提到的改变:
在add item VC
中获取一个全局变量或属性(目标c概念)。现在当你从add item VC
来lust VC
时,将此全局变量或属性设置为self
之类的内容,
AddListItemVC *advc = [self.storyboard instantiateViewControllerWithIdentifier:@"addListItem"]; // addListItem is storyboard id for viewcontroller
[self presentViewController:advc animated:NO completion:^{
advc.vc = self; // here vc is the propery of type `UIVIewController` declare in AddListItemVC
}];
现在,您从details VC
转到add list VC
的代码应该是,
DetailListViewController *dvc = [self.storyboard instantiateViewControllerWithIdentifier:@"detailViewScreen"]; // detailViewScreen is storyboard id which you can set from identity inspector
[self dismissViewControllerAnimated:NO completion:^{
[self.vc.navigationController pushViewController:dvc animated:YES]; // here self.vc is global variable or property that contains reference of first VC (i.e. list view controller)
}];
在这种情况下无需使用performsegue
。您可以使用performsegue
直接从detailvc
进入list vc
,我来自$offset
。
希望你理解概念,因为时间的湖,我写了客观的c片段!希望你能轻易转换成swift !!
答案 1 :(得分:0)
首先,正如你所说addVC是模态呈现的,所以请确保addVC有一些导航,否则你将无法从addVC推送listItemVC。
现在第二件事,当你以模态方式呈现addVC然后推送从addVC推送的listItemVC时,现在addVC导航控制器有两个视图控制器。当你致电navigationController?.popToRootViewController(animated: true)
时,这将带你进入addVC,因为这就是为什么你无法看到listVC的原因。
要解决这个问题,您只要在到达addVC时添加一些解雇的视图控制器。