With support for XS integration of iOS storyboards about to make the Stable stream, I would love to be able to use this feature in conjunction with MVVMCross.
Fundamentally it does seem a little like it should not work, as with storyboards indicate navigational hierarchy in the view project, rather than a viewmodel project like MVVMCross.
But it would be awesome if there is a way to make the 2 work together.
Does anyone know how this might be achieved?
Cheers, Tristan
There is at least one sample published showing the use of Storyboards - the rather oddly named
eh
- https://github.com/slodge/ehThis sample worked by:
MvxViewController
as a VC base class (in place ofUIViewController
)ViewModel
in one case - by setting it directly before callingbase.ViewDidLoad()
- see https://github.com/slodge/eh/blob/master/storyb/RootViewController.cs#L23Request
in one case - during theSegue
navigation - see https://github.com/slodge/eh/blob/master/storyb/RootViewController.cs#L40Using approaches like this it's pretty easy to add Mvx Data-Binding to an application that is primarily driven by the Storyboard.
Alternatively, if developers would prefer to let the Mvx
ShowViewModel
navigation system control the flow of screens - but would also prefer those screens to be designed within a storyboard, then this is possible by developing a normal MvvmCross application, but using a customPresenter
which loads ViewControllers from the storyboard.In v3.1.1 of MvvmCross, you can do this at the
ViewsContainer
level:MyContainer
fromMvxTouchViewsContainer.cs
protected virtual IMvxTouchView CreateViewOfType(Type viewType, MvxViewModelRequest request)
- see https://github.com/MvvmCross/MvvmCross/blob/b8545752f28f4e569efeaa397c3085b0373e4d8b/Cirrious/Cirrious.MvvmCross.Touch/Views/MvxTouchViewsContainer.cs#L40in this override, load your Storyboard-based ViewControllers:
create your
MyContainer
duringSetup
-that should just then work...
Storyboard support is now a part of MvvmCross. Use the one ViewController per Storyboard approach as described in Geir's answer, setting the Storyboard ID, and decorate your MvxViewController partial classes with
[MvxFromStoryboard]
. See sample code on my blog.In a large project, keeping all views in a single storyboard may be daunting.
I prefer creating one storyboard per view; I modified the Container in Stuart's answer to look for a storyboard matching the view class, and fall back to the main storyboard if not found:
Caveat 1: To instantiate viewcontrollers this way, you must set the Storyboard ID in the editor:
Caveat 2: Make sure your views inheriting
MvxViewController
have the constructorpublic MyView(IntPtr handle) : base(handle)
, as this is used to instantiate the view controllers from the storyboard.I've made a sample project (TipCalc) using mvvmcross and ios storyboard: https://github.com/nicruo/TipCalc.Storyboard