0

UIViewController ( https://bitbucket.org/thedillonb/monotouch.slideoutnavigation/src/f4e51488598b/MonoTouch.SlideoutNavigation?at=master ) から既に継承しているサード パーティのビュー コントローラーを使用したいのですが、それを MVVMCross と統合するにはどうすればよいですか?

ソースを取得して、MvxViewController から継承するように変更することもできますが、他のライブラリでこれに遭遇すると推測しています。

MvxViewController が行うすべてのインターフェイスを実装する必要がありますか? IMvxTouchView? IMvxEventSourceViewController?

4

2 に答える 2

1

以下のようなカスタム ビュー プレゼンターを使用できます。

public class Presenter
    : IMvxTouchViewPresenter
{
    private readonly MvxApplicationDelegate applicationDelegate;
    private readonly UIWindow window;
    private SlideoutNavigationController slideNavigationController;
    private IMvxTouchViewCreator viewCreator;

    public Presenter(MvxApplicationDelegate applicationDelegate, UIWindow window)
    {
        this.applicationDelegate = applicationDelegate;
        this.window = window;

        this.slideNavigationController = new SlideoutNavigationController();

        this.slideNavigationController.SlideWidth = 200f;

        this.window.RootViewController = this.slideNavigationController;

    }

    public async void Show(MvxViewModelRequest request)
    {
        var creator = Mvx.Resolve<IMvxTouchViewCreator>();

        if (this.slideNavigationController.MenuView == null)
        {
            // TODO: MAke this not be sucky
            this.slideNavigationController.MenuView = (MenuView)creator.CreateView(new MenuViewModel());
            ((MenuView) this.slideNavigationController.MenuView).MenuItemSelectedAction = this.MenuItemSelected;
        }

        var view = creator.CreateView(request);


        this.slideNavigationController.TopView = (UIViewController)view;


    }

    public void ChangePresentation(MvxPresentationHint hint)
    {
        Console.WriteLine("Change Presentation Requested");
    }

    public bool PresentModalViewController(UIViewController controller, bool animated)
    {
        Console.WriteLine("Present View Controller Requested");
        return true;
    }

    public void NativeModalViewControllerDisappearedOnItsOwn()
    {
        Console.WriteLine("NativeModalViewControllerDisappearedOnItsOwn");
    }

    private void MenuItemSelected(string targetType, string objectId)
    {
        var type = Type.GetType(string.Format("App.Core.ViewModels.{0}ViewModel, AppCore", targetType));
        var parameters = new Dictionary<string, string>();
        parameters.Add("objectId", objectId);
        this.Show(new MvxViewModelRequest { ViewModelType = type, ParameterValues = parameters });
    }
}
于 2013-08-09T20:10:35.490 に答える
1

この特定のケースでは、実際にはデータ バインディングを行いたくないので、カスタム プレゼンターを使用できます。たとえば、@Blounty の回答を参照するか、このプロジェクトのデモを参照してください - https://github.com/fcaico/MvxSlidingPanels 。接する


データバインディングをサポートするためにサードパーティの基本クラスを変換する必要がある場合ViewController、最も簡単な方法はまさにあなたが推測したとおりです。

  • それらから継承してEventSource-ViewControllerを提供します
  • -ViewController から継承してEventSource、Mvx BindingContext を追加します

この手法は、データバインディングを提供するために、、 、 などMvvmCrossのそれぞれを拡張する方法そのものです。UIViewControllerUITableViewControllerUITabBarController

たとえば、次を参照してください。

C# には Multiple-Inhertiance または真の Mixin サポートがないため、ViewController のこの適応には少しカットアンドペーストが必要ですが、イベント フックと拡張メソッドを使用してこれを最小限に抑えようとしました。

それが役立つ場合、以前の MvvmCross バージョンのこの iOS 手法は、Integrating Google Mobile Analytics with MVVMCrossで説明されていました (明らかに、これは現在では古くなっていますが、一般的な原則は同じままです - 継承を介して既存のビューコントローラーを適応させます)。

Android では、同様のプロセスがアクティビティ基本クラスにも適用されます。最新の MVVMCross を使用した ActionBarSherlock を参照してください。

于 2013-08-10T03:42:19.300 に答える