安定したストリームを作成しようとしているiOSストーリーボードのXS統合のサポートにより、この機能をMVVMCrossと組み合わせて使用できるようにしたいと思います。
基本的には、ストーリーボードがMVVMCrossのようなビューモデルプロジェクトではなく、ビュープロジェクトのナビゲーション階層を示しているため、機能しないように見えます。
しかし、2つを一緒に機能させる方法があれば素晴らしいでしょう。
誰かがこれがどのように達成されるか知っていますか?
乾杯、トリスタン
ストーリーボードの使用を示すサンプルが少なくとも1つ公開されています-かなり奇妙な名前のeh
- https://github.com/slodge/eh
このサンプルは以下によって機能しました:
MvxViewController
をVC基本クラス(UIViewController
の代わりに)として使用)ViewModel
を設定します-直接beforeを呼び出して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このようなアプローチを使用すると、主にストーリーボードによって駆動されるアプリケーションにMvxデータバインディングを追加するのは非常に簡単です。
あるいは、開発者がMvx ShowViewModel
ナビゲーションシステムに画面の流れを制御させたいが、ストーリーボード内でそれらの画面を設計したい場合は、通常のMvvmCrossアプリケーションを開発することで可能ですが、ストーリーボードからViewControllerをロードするカスタムPresenter
。
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/MvxTouchViewを参照してください#L40このオーバーライドで、ストーリーボードベースのViewControllerをロードします。
_ 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つのストーリーボードに保持するのは困難な場合があります。
ビューごとに1つのストーリーボードを作成することを好みます。スチュアートの回答のコンテナを変更して、ビュークラスに一致するストーリーボードを探し、見つからない場合はメインストーリーボードにフォールバックします。
_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:この方法でビューコントローラーをインスタンス化するには、必須エディターでストーリーボードIDを設定します。
警告2:MvxViewController
を継承するビューにコンストラクターpublic MyView(IntPtr handle) : base(handle)
があることを確認してください。これは、ストーリーボードからビューコントローラーをインスタンス化するために使用されます。
ストーリーボードのサポートがMvvmCrossの一部になりました。 Geirの回答で説明されているように、ストーリーボードごとに1つのViewControllerアプローチを使用して、ストーリーボードIDを設定し、MvxViewController部分クラスを[MvxFromStoryboard]
で装飾します。私の ブログ のサンプルコードを参照してください。
Mvvmcrossとiosストーリーボードを使用してサンプルプロジェクト(TipCalc)を作成しました: https://github.com/nicruo/TipCalc.Storyboard