使用带MVVM Light的标签栏(iOS)

Gil*_*and 5 mvvm uitabbarcontroller uinavigationcontroller ios

我有两个选项卡UITabBarController,两个都是UINavigationControllers.问题是初始化NavigationService需要一个UINavigationControlleras参数.我想要找到一种方法,以root身份使用导航控制器选项卡,或者找到一种方法将选项卡控制器作为root用户.

我最终有三个选择:

1. 

                /->  Ctrl 1 -> ctrl 2      
    Nav -> Tab - 
                \->  Ctrl 1 -> ctrl 2
Run Code Online (Sandbox Code Playgroud)

此选项有效,但使用另一个控制器时标签栏会丢失NavigateTo().这不是解决方案,我确实需要各处的标签.

2.
        /-> Nav -> Ctrl 1 -> ctrl 2      
   Tab - 
        \-> Nav -> Ctrl 1 -> ctrl 2
Run Code Online (Sandbox Code Playgroud)

这根本不起作用,因为SimpleIoc只需要a UINavigationController,并导致崩溃.显然,这根本不是解决方案.

3.

Navigate using segue or pushing controllers manually, the 'classic' way.
Run Code Online (Sandbox Code Playgroud)

这完全违背了使用MVVM-Light的目的,这也不是解决方案.

在Stack Overflow上看到了另一篇文章,他最终选择了选项3.我希望在这里找到别的东西.

任何人都对这个可能的解决方案有任何想法吗?或者我是SOL?

Ruf*_*all 0

我不太会说选项 3 违背了 MVVM-Light 的目的,虽然不是很好,但它是一个选项 - 最好将 View 注入到界面后面的 ViewModel 中,然后使用它进行导航。这样您仍然可以从 viewModel 控制导航,并且还允许您仍然测试 viewModel 的导航部分,因为“View”位于界面后面(可以在此处使用简单的模拟对象)。

我看到的另一个选择是仅使用与您的项目紧密相关的完全自定义的 INavigationService。您可以在这两个链接中看到执行这些操作的项目:

https://github.com/losi999/XamarinSample/blob/f46e9cb1b1c152ff4510123f53b9d8bd9ddacdcf/XamarinSample.Core/Services/INavigationService.cs

https://github.com/mstein11/Happimeter/blob/691501f397a9c86d400a1fe4fe94bb866588a98e/iOS/Services/NativeNavigationService.cs

我想如果您创建一个自定义的 NavigationService,它将为您提供最终的控制权,并且您还可以访问历史记录,以便您可以选择显示 viewControllers Modaly、推送它们或根据当前视图层次结构使用不同的动画。