2017-09-20 150 views
0

我试图以模态方式呈现视图控制器,并获得着名的Presenting view controllers on detached view controllers is discouraged错误。我研究了它,并且共识解决方案似乎是从父母那里做出的演示文稿,我尝试过但没有成功。我怀疑问题是因为导航控制器是作为一个静态属性从结构实例化的(为了让其他视图控制器更容易弹出到根,因为这是UX所要求的)。如何从独立视图控制器呈现视图控制器?

struct SectionNavigationControllers { 
    static var one = SectionNavigationController() 
    static var two = SectionNavigationController() 
    static var three = SectionNavigationController() 
    static var four = SectionNavigationController() 
} 

这里是其中所述导航控制器中的一个被创建(使用本结构):

let SectionOneRoot = MasterSearchViewController() 

func addNavigationController() { 

    self.addChildViewController(SectionOneRoot) 
    SectionOneRoot.didMove(toParentViewController: self) 
    SectionNavigationControllers.one = SectionNavigationController(rootViewController: SectionOneRoot) 
    view.addSubview(SectionNavigationControllers.one.view) 

} 


因此,当我尝试从MasterSearchViewController(根视图模态呈现视图控制器控制器),我得到了上述错误。

navigationController?.present(Random200ViewController(), animated: true, completion: nil) 


想法?

+1

获取app主窗口,然后获取对根视图控制器的引用;你应该可以使用它来呈现新的视图控制器 – ekscrypto

回答

1

这里有一个方便的功能,您可以添加到任何一段代码在任何地方呈现视图控制器你的应用程序:

func showModally(_ viewController: UIViewController) { 
    let window = UIApplication.shared.keyWindow 
    let rootViewController = window?.rootViewController 
    rootViewController?.present(viewController, animated: true, completion: nil) 
} 

我希望它有帮助!

+0

它工作完美,谢谢!这是呈现视图控制器的首选方式还是在这里涉及某种程度的“hackery”? – sconewolf

+0

@sconewolf通常,您会从当前呈现的视图控制器呈现视图控制器,而不是应用程序的根视图控制器。有时尽管更简单,但如果试图找到当前活动的视图控制器太麻烦了,这是一个很好的做事方式。 – ekscrypto

+0

如果我以这种方式呈现它,并且想要使用UIViewControllerAnimatedTransitioning对象来创建自定义动画,哪个视图控制器需要符合协议并调用持续时间和动画对象方法?应用程序根目录? – sconewolf

1

如果你想呈现在你的应用程序的根的viewController,你可以做这样的:

let rootVC = UIApplication.shared.keyWindow?.rootViewController 

rootVC?.present(Random200ViewController(), animated: true, completion: nil) 
+1

啊,我看@ekscrypto说了上面的同样的事情。 – clarus

+0

对不起,我在我的移动设备上输入一个示例源代码非常乏味,所以我仅限于发表评论。好的工作拿出类似的解决方案! – ekscrypto

+0

你们两个都保存了我的屁股,我希望我能给2个复选标记,但@ekscrypto在你之前的几分钟内插入。但仍然连根拔起,仍然感激你的帮助! – sconewolf

相关问题