web-dev-qa-db-ja.com

Xamarin.iOSストーリーボードのMVVMCrossサポート

安定したストリームを作成しようとしているiOSストーリーボードのXS統合のサポートにより、この機能をMVVMCrossと組み合わせて使用​​できるようにしたいと思います。

基本的には、ストーリーボードがMVVMCrossのようなビューモデルプロジェクトではなく、ビュープロジェクトのナビゲーション階層を示しているため、機能しないように見えます。

しかし、2つを一緒に機能させる方法があれば素晴らしいでしょう。

誰かがこれがどのように達成されるか知っていますか?

乾杯、トリスタン

26
Jedi Developer

ストーリーボードの使用を示すサンプルが少なくとも1つ公開されています-かなり奇妙な名前のeh- https://github.com/slodge/eh

このサンプルは以下によって機能しました:

このようなアプローチを使用すると、主にストーリーボードによって駆動されるアプリケーションに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();
    } 
    _
  • それはちょうどそれからうまくいくはずです...

30
Stuart

大規模なプロジェクトでは、すべてのビューを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を設定します。

Storyboard ID

警告2:MvxViewControllerを継承するビューにコンストラクターpublic MyView(IntPtr handle) : base(handle)があることを確認してください。これは、ストーリーボードからビューコントローラーをインスタンス化するために使用されます。

11
Geir Sagberg

ストーリーボードのサポートがMvvmCrossの一部になりました。 Geirの回答で説明されているように、ストーリーボードごとに1つのViewControllerアプローチを使用して、ストーリーボードIDを設定し、MvxViewController部分クラスを[MvxFromStoryboard]で装飾します。私の ブログ のサンプルコードを参照してください。

8
kwl

Mvvmcrossとiosストーリーボードを使用してサンプルプロジェクト(TipCalc)を作成しました: https://github.com/nicruo/TipCalc.Storyboard

3
nicruo