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

时间:2016-09-20 14:35:17

标签: ios mvvm uinavigationcontroller uitabbarcontroller

我在UITabBarController中有两个标签,两个标签都是UINavigationControllers。问题是NavigationService的初始化需要UINavigationController作为参数。我想找到一种方法,以root身份使用导航控制器,或者找到一种方法将制表符控制器作为root。

我最终有三个选择:

1. 

                /->  Ctrl 1 -> ctrl 2      
    Nav -> Tab - 
                \->  Ctrl 1 -> ctrl 2

此选项有效,但使用NavigateTo()推送另一个控制器时标签栏会丢失。这不是一个解决方案,我确实需要在任何地方使用标签。

2.
        /-> Nav -> Ctrl 1 -> ctrl 2      
   Tab - 
        \-> Nav -> Ctrl 1 -> ctrl 2

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

3.

Navigate using segue or pushing controllers manually, the 'classic' way.

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

我见过another post on Stack Overflow,他最终选择了选项3.我希望在这里找到别的东西。

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

1 个答案:

答案 0 :(得分:0)

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

我看到的另一种选择是只使用与项目密切相关的完全自定义的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,推送它们或根据当前视图层次使用不同的动画。