由于支持XS集成iOS故事板即将制作Stable流,我希望能够将此功能与MVVMCross结合使用。
从根本上说它似乎有点像它不应该工作,就像故事板指示视图项目中的导航层次结构,而不是像MVVMCross那样的视图模型项目。
但如果有办法让2人一起工作,那将会很棒。
有谁知道如何实现这一目标?
干杯,特里斯坦
答案 0 :(得分:30)
至少发布了一个展示故事板使用情况的样本 - 名字相当奇怪eh
- https://github.com/slodge/eh
此样本的工作原理为:
MvxViewController
作为VC基类(代替UIViewController
)ViewModel
- 在>强调base.ViewDidLoad()
之前直接设置 - 请参阅https://github.com/slodge/eh/blob/master/storyb/RootViewController.cs#L23 Request
- 在Segue
导航期间 - 请参阅https://github.com/slodge/eh/blob/master/storyb/RootViewController.cs#L40 使用这样的方法,将Mvx数据绑定添加到主要由故事板驱动的应用程序中非常容易。
或者,如果开发人员更愿意让Mvx ShowViewModel
导航系统控制屏幕流 - 但也希望在故事板中设计这些屏幕,那么可以通过开发正常的MvvmCross应用程序来实现,但是使用从故事板加载ViewControllers的自定义Presenter
。
在MvvmCross的v3.1.1中,您可以在ViewsContainer
级别执行此操作:
MyContainer
MvxTouchViewsContainer.cs
protected virtual IMvxTouchView CreateViewOfType(Type viewType, MvxViewModelRequest request)
- 请参阅https://github.com/MvvmCross/MvvmCross/blob/b8545752f28f4e569efeaa397c3085b0373e4d8b/Cirrious/Cirrious.MvvmCross.Touch/Views/MvxTouchViewsContainer.cs#L40 在此覆盖中,加载基于Storyboard的ViewControllers:
protected override IMvxTouchView CreateViewOfType(Type viewType, MvxViewModelRequest request)
{
return (IMvxTouchView)UIStoryboard.FromName("MyStoryBoard", null)
.InstantiateViewController(viewType.Name);
}
在MyContainer
-
Setup
protected override IMvxTouchViewsContainer CreateTouchViewsContainer()
{
return new MyContainer();
}
那应该就行了......
答案 1 :(得分:11)
在一个大型项目中,将所有视图保留在一个故事板中可能会令人生畏。
我更喜欢为每个视图创建一个故事板;我在Stuart的答案中修改了Container,以寻找与视图类匹配的故事板,如果没有找到,则回到主故事板:
public class StoryBoardContainer : MvxTouchViewsContainer
{
protected override IMvxTouchView CreateViewOfType(Type viewType, MvxViewModelRequest request)
{
UIStoryboard storyboard;
try
{
storyboard = UIStoryboard.FromName(viewType.Name, null);
}
catch (Exception)
{
storyboard = UIStoryboard.FromName("StoryBoard", null);
}
return (IMvxTouchView) storyboard.InstantiateViewController(viewType.Name);
}
}
警告1:要以这种方式实例化viewcontrollers,您必须在编辑器中设置Storyboard ID:
警告2:确保继承MvxViewController
的视图具有构造函数public MyView(IntPtr handle) : base(handle)
,因为它用于从故事板中实例化视图控制器。
答案 2 :(得分:8)
故事板支持现在是MvvmCross的一部分。使用一个ViewController / Storyboard方法,如Geir的答案中所述,设置Storyboard ID,并用{{1}}装饰你的MvxViewController部分类。请参阅我的blog上的示例代码。
答案 3 :(得分:3)
我使用mvvmcross和ios故事板制作了一个示例项目(TipCalc):https://github.com/nicruo/TipCalc.Storyboard