从添加屏幕发送时,popToRootViewController无法正常工作

时间:2016-11-08 10:58:32

标签: ios swift segue

我正在构建一个简单的应用程序。 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。该按钮不再起作用

enter image description here

2 个答案:

答案 0 :(得分:2)

在您的情况下,您不需要使用segue。你必须清除一些概念。

如果您从popToRootViewController推送或显示视图控制器,则无法VCmodally presented vc

现在,如果你想实现这个目标,那么你必须做一些我想在下面提到的改变:

add item VC中获取一个全局变量或属性(目标c概念)。现在当你从add item VClust 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时添加一些解雇的视图控制器。