0

我想使用已经从 UIViewController ( https://bitbucket.org/thedillonb/monotouch.slideoutnavigation/src/f4e51488598b/MonoTouch.SlideoutNavigation?at=master )继承的第三方视图控制器,我将如何将它与 MVVMCross 集成?

我可以只获取源并将其更改为从 MvxViewController 继承,但我猜我会在其他库中遇到这个问题。

我需要实现 MvxViewController 的所有接口吗?IMvxTouchView?IMvxEventSourceViewController?

4

2 回答 2

1

您可以使用如下所示的自定义视图演示器,这几乎是使用 SlideOutNavigation 直接从我的应用程序中提取出来的。

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
  • EventSource-ViewController 继承以添加 Mvx BindingContext

这种技术本身就是如何MvvmCross扩展UIViewController, UITableViewController,UITabBarController等以提供数据绑定的。

例如,请参阅:

请注意,由于 C# 没有任何 Multiple-Inhertiance 或任何真正的 Mixin 支持,因此 ViewControllers 的这种适应确实涉及一些剪切和粘贴,但我们已尝试通过使用事件挂钩和扩展方法来最小化这种情况。

如果有帮助,之前 MvvmCross 版本的这种 iOS 技术在Integrating Google Mobile Analytics with MVVMCross中进行了讨论(显然现在已经过时了 - 但一般原则保持不变 - 我们通过继承调整现有的视图控制器)

在 Android 中,Activity 基类也遵循类似的过程 - 请参阅带有最新 MVVMCross 的 ActionBarSherlock

于 2013-08-10T03:42:19.300 回答