支持将 iOS storyboard 与 XS 集成的功能即将发布到 Stable 流,我希望能够结合 MVVMCross 使用此功能。
从根本上讲,它似乎有点不应该工作,因为 storyboard 表示视图项目中的导航层次结构,而不是像 MVVMCross 这样的 viewmodel 项目。
但如果有一种方法可以使这两个一起工作,那就太棒了。
有人知道如何实现吗?
谢谢,Tristan
eh
(https://github.com/slodge/eh)。
这个示例的工作方式:
MvxViewController
作为VC基类(代替UIViewController
)ViewModel
- 通过在调用base.ViewDidLoad()
之前直接设置它之前 - 参见https://github.com/slodge/eh/blob/master/storyb/RootViewController.cs#L23Request
- 在Segue
导航期间 - 参见https://github.com/slodge/eh/blob/master/storyb/RootViewController.cs#L40使用这样的方法,向由Storyboard驱动的应用程序添加Mvx数据绑定非常容易。
或者,如果开发人员更喜欢使用Mvx ShowViewModel
导航系统控制屏幕流程 - 但也希望这些屏幕是在Storyboard中设计的,那么可以通过开发普通的MvvmCross应用程序,但使用一个自定义Presenter
从Storyboard加载ViewControllers。
在MvvmCross v3.1.1中,您可以在ViewsContainer
级别上执行此操作:
MvxTouchViewsContainer.cs
覆盖类MyContainer
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);
}
在 Setup
过程中创建您的 MyContainer
-
protected override IMvxTouchViewsContainer CreateTouchViewsContainer()
{
return new MyContainer();
}
那应该只是能够正常工作...
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: 要以这种方式实例化视图控制器,您必须在编辑器中设置Storyboard ID:
注意事项2:确保您的视图继承MvxViewController
, 并且具有构造函数public MyView(IntPtr handle) : base(handle)
,因为这将用于从故事板实例化视图控制器。
现在,故事板支持已成为MvvmCross的一部分。按照Geir的答案中所述,使用每个Storyboard一个ViewController的方法,设置Storyboard ID,并将你的MvxViewController部分类装饰上[MvxFromStoryboard]
。请参阅我的博客上的示例代码。
我用mvvmcross和ios storyboard制作了一个样本项目(TipCalc): https://github.com/nicruo/TipCalc.Storyboard