如何在不关闭整个堆栈的情况下解除导航控制器中的视图控制器

时间:2017-03-19 16:54:21

标签: ios swift uinavigationcontroller

基本上我有标签栏控制器有两个标签,每个标签都有一个单独的导航控制器,每个控制器都有几个视图(见下文)。

enter image description here

在“顶部”导航控制器(保存在右侧选项卡中)中,我可以选择一个图像,然后将其带到最右边的屏幕以预览图像......

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let image = info[UIImagePickerControllerEditedImage] as? UIImage {

        let previewController = self.storyboard?.instantiateViewController(withIdentifier: "previewVC") as! PreviewViewController
        previewController.img = image
        previewController.navigationItem.setHidesBackButton(true, animated: false)
        self.navigationController?.pushViewController(previewController, animated: true)

        self.dismiss(animated: true, completion: nil)
    }
}

...点击“发布”。这会上传图片并调用self.tabBarController?.selectedIndex = 0

只需将我带到图像Feed,它位于“底部”导航控制器(左侧标签)中。到现在为止还挺好。但是,当我需要在发布后显示上传屏幕时,预览屏幕仍显示在“右侧”选项卡中。

如果我点击帖子时拨打self.dismiss(animated: true, completion: nil),整个导航控制器都会被解除,我会被带回登录界面。

所以我试图关闭预览控制器,以便上传控制器在右侧选项卡中显示为默认视图,而不会忽略该导航控制器中的整个堆栈。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

如果使用navigation controllers将视图控制器添加到导航堆栈(推送),则可以通过调用pop函数将其删除。当您以模态方式呈现视图控制器时,可以调用dismiss来删除视图控制器。

答案 1 :(得分:0)

委托函数为您提供(图像选取器)视图控制器,您应该忽略它,而不是作为委托的视图控制器(通常是呈现视图控制器)。也许尝试这样的事情:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let image = info[UIImagePickerControllerEditedImage] as? UIImage {

        let previewController = self.storyboard?.instantiateViewController(withIdentifier: "previewVC") as! PreviewViewController
        previewController.img = image
        previewController.navigationItem.setHidesBackButton(true, animated: false)
        self.navigationController?.pushViewController(previewController, animated: true)

        picker.dismiss(animated: true, completion: nil)
    }
}