Swift 如何使用segue维护导航;以“方式”呈现;?

Swift 如何使用segue维护导航;以“方式”呈现;?,swift,xcode,Swift,Xcode,我有:导航控制器->tableViewController->选项卡栏控制器->ViewController1/ViewController2/ViewController3 我单击TableViewController上的一个单元格,然后打开选项卡栏。一切都好 但是,我想从TableViewController中的数据中获得更多细节,所以我决定用单元格的内容弹出一个窗口。我发现这个教程=>很棒!这是关于使用segue“present modally”和包含弹出窗口的viewcontroller

我有:导航控制器->tableViewController->选项卡栏控制器->ViewController1/ViewController2/ViewController3

我单击TableViewController上的一个单元格,然后打开选项卡栏。一切都好

但是,我想从TableViewController中的数据中获得更多细节,所以我决定用单元格的内容弹出一个窗口。我发现这个教程=>很棒!这是关于使用segue“present modally”和包含弹出窗口的viewcontroller。我从弹出窗口链接到tabBarController,失去了导航栏

我试着玩navigationBar,但没有任何效果。我改变了segue的类型,但是我没有得到我想要的

我认为问题来自赛格的类型。如果我像在viewController中使用go/back一样使用它,这没关系。你有没有关于使用这种弹出窗口的解决方案,或者我必须使用另一种方式

> P> >好的,让我们看一看。

  • 导航栏是导航控制器提供的视图。有时我们会被导航栏和导航项弄糊涂。导航栏是唯一一个,它属于导航控制器,导航项属于导航堆栈中的单个视图控制器。所以,第一步很简单:若你们想要导航栏,那个么将你们的模型控制器包装到导航堆栈中

  • 是的,您将面临其他问题,先前控制器的模糊视图将变成黑色区域。为什么?有一个名为Presentation Controller(
    UIPresentationController
    )的特殊对象,负责控制器的显示方式。默认情况下,它会隐藏上一个控制器的视图(我认为是为了性能)

  • 好的,我们走吧。我们可以创建自定义表示控制器,并告诉它不要隐藏上一个控制器的视图。像这样:

  • 下一步。在控制器中,我们希望以模态的方式呈现,我们必须指定:我们希望使用自定义呈现控制器,我们还希望调整委托对象以进行转换(在这里我们可以指定自定义呈现控制器)。诀窍是,您必须在初始化器中执行此操作,因为
    viewDidLoad
    为时已晚:控制器已经初始化:
  • 最后一步。当
    PopupViewController
    成为其自身转换的委托时,这意味着该控制器负责所有转换。在我们的特殊情况下,popup controller提供了presentation controller的自定义版本。像这样:
  • 就这些。现在您应该看到上一个控制器的视图
  • 导航栏是导航控制器提供的视图。有时我们会被导航栏和导航项弄糊涂。导航栏是唯一一个,它属于导航控制器,导航项属于导航堆栈中的单个视图控制器。所以,第一步很简单:若你们想要导航栏,那个么将你们的模型控制器包装到导航堆栈中

  • 是的,您将面临其他问题,先前控制器的模糊视图将变成黑色区域。为什么?有一个名为Presentation Controller(
    UIPresentationController
    )的特殊对象,负责控制器的显示方式。默认情况下,它会隐藏上一个控制器的视图(我认为是为了性能)

  • 好的,我们走吧。我们可以创建自定义表示控制器,并告诉它不要隐藏上一个控制器的视图。像这样:

  • 下一步。在控制器中,我们希望以模态的方式呈现,我们必须指定:我们希望使用自定义呈现控制器,我们还希望调整委托对象以进行转换(在这里我们可以指定自定义呈现控制器)。诀窍是,您必须在初始化器中执行此操作,因为
    viewDidLoad
    为时已晚:控制器已经初始化:
  • 最后一步。当
    PopupViewController
    成为其自身转换的委托时,这意味着该控制器负责所有转换。在我们的特殊情况下,popup controller提供了presentation controller的自定义版本。像这样:

  • 就这些。现在您应该看到上一个控制器的视图

    将模态呈现的控制器包装到新的导航控制器hello@SergeyGamayunov好的,谢谢。我照你说的做了。它在跑!但是我失去了弹出窗口后面的tableview的效果。有没有办法让它成为可能?我想这是使用这种弹出窗口的目的。。。谢谢你提供前后截图?我不确定我是否理解你correctly@SergeyGamayunov你好,谢尔盖,你有什么解决办法吗?谢谢将模态呈现的控制器包装到新的导航控制器hello@SergeyGamayunov好的,谢谢。我照你说的做了。它在跑!但是我失去了弹出窗口后面的tableview的效果。有没有办法让它成为可能?我想这是使用这种弹出窗口的目的。。。谢谢你提供前后截图?我不确定我是否理解你correctly@SergeyGamayunov你好,谢尔盖,你有什么解决办法吗?谢谢你好@SergeyGamayunov,我刚刚试过你的方法,但没有改变。导航栏总是absentHello@SergeyGamayunov,我刚刚试过你的方法,但没有改变。导航栏总是不存在
    class CustomPresentationController: UIPresentationController {
        override var shouldRemovePresentersView: Bool {
            return false
        }
    }
    
    class PopupViewController: UIViewController {
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
    
            modalPresentationStyle = .custom
            transitioningDelegate = self
        }
    }
    
    extension PopupViewController: UIViewControllerTransitioningDelegate {
        func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
            return CustomPresentationController(presentedViewController: presented, presenting: presenting)
        }
    }