Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Menu 有没有人让Xamarin边栏、MVVMCross和故事板一起工作?_Menu_Xamarin_Storyboard_Mvvmcross_Flyout - Fatal编程技术网

Menu 有没有人让Xamarin边栏、MVVMCross和故事板一起工作?

Menu 有没有人让Xamarin边栏、MVVMCross和故事板一起工作?,menu,xamarin,storyboard,mvvmcross,flyout,Menu,Xamarin,Storyboard,Mvvmcross,Flyout,我已经尝试了所有我能在网上找到的排列方式,但似乎都无法实现 我在故事板中定义了我的iOS应用程序UI,MVVM框架主要是MVVMCross,并加入了一些反应UI以增加味道 我定义了一个RootViewController,在其中生成附加到AppDelegate的SideBarController,如下所示: [Register ("AppDelegate")] public partial class AppDelegate : MvxApplicationDelegate { publ

我已经尝试了所有我能在网上找到的排列方式,但似乎都无法实现

我在故事板中定义了我的iOS应用程序UI,MVVM框架主要是MVVMCross,并加入了一些反应UI以增加味道

我定义了一个RootViewController,在其中生成附加到AppDelegate的SideBarController,如下所示:

[Register ("AppDelegate")]
public partial class AppDelegate : MvxApplicationDelegate
{
    public override UIWindow Window { 
        get;
        set;
    }

    public AppDelegate ()
    {
    }

    public SidebarController SidebarController { get; set; }
    public override void FinishedLaunching (UIApplication application)
    {
        var presenter = new MvxModalSupportTouchViewPresenter (this, Window);
        var setup = new Setup (this, presenter);

        setup.Initialize ();

        var startUp = Mvx.Resolve<IMvxAppStart> ();
        startUp.Start ();
    }
}
在RootViewController中,我有:

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        if (ViewModel == null)
            return;

        var appDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;      
        appDelegate.SidebarController = new SidebarController (this, 
            (UIViewController)this.CreateViewControllerFor<LoginViewModel>(), 
            (UIViewController)this.CreateViewControllerFor<SideMenuViewModel>());
        appDelegate.SidebarController.MenuWidth = 250;
        appDelegate.SidebarController.ReopenOnRotate = false;
        appDelegate.SidebarController.MenuLocation = SidebarController.MenuLocations.Right;
    }
在用户成功登录后,他们将被导航到一个带有汉堡按钮的登录页面。用户单击burger按钮后,不会显示侧菜单,但会显示执行ToggleMenu调用前后的所有跟踪。我绞尽脑汁想让它发挥作用,但3天后我想我可能给自己造成了脑震荡


有人试过让这个组合工作吗

对我来说,它正在发挥作用。我不确定您的问题在哪里,但这是我的代码:

[Register ("AppDelegate")]
    public partial class AppDelegate : MvxApplicationDelegate
    {
        UIWindow window;

        public RootViewController RootViewController { get { return window.RootViewController as RootViewController; } }

        public override bool FinishedLaunching (UIApplication app, NSDictionary options)
        {
            window = new UIWindow(UIScreen.MainScreen.Bounds);

            var presenter = new Presenter(this, window);

            var setup = new Setup(this, presenter);
            setup.Initialize();

            var startup = Mvx.Resolve<IMvxAppStart>();
            startup.Start();

            window.MakeKeyAndVisible();

            return true;
        }
    }
对于根控制器:

public class RootViewController: UIViewController, IMvxCanCreateTouchView
    {
        public SidebarController SidebarController { get; private set; }
        private UIViewController root;

        public RootViewController (UIViewController root)
        {
            this.root = root;
        }

        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            var menuContentView = this.CreateViewControllerFor<MenuViewModel> () as MenuViewController;
            SidebarController = new SidebarController (this, root, menuContentView) {
                MenuLocation = SidebarController.MenuLocations.Left,
                HasShadowing = false
            };
        }

        public void NavigateToView (UIViewController view)
        {
            SidebarController.ChangeContentView (new UINavigationController (view));
        }
    }
作为其他控制器的基类,我有:

public interface IControllerWithCustomNavigation
    {
        void NavigateToView (UIViewController controller);
    }

public class BaseController<TViewModel>: MvxViewController where TViewModel: BaseViewModel
    {
        protected bool NavigationBarEnabled = true;

        public new TViewModel ViewModel {
            get { return (TViewModel)base.ViewModel; }
            set { base.ViewModel = value; }
        }

        public BaseController (string nib) : base (nib, null)
        {
        }

        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            if (NavigationBarEnabled) {
                NavigationController.NavigationBarHidden = false;

                updateNavigationBar ();

                if (isRootViewModel()) {
                    addNavigationBarItemForMenu ();
                }
            } else if (NavigationController != null) {
                NavigationController.NavigationBarHidden = true;
            }
        }

        private void updateNavigationBar()
        {
            var navigationBar = NavigationController.NavigationBar;

            var colorTint = UIColor.FromRGB (133, 231, 110);
            var colorWhite = UIColor.White;

            navigationBar.BarTintColor = colorWhite;
            navigationBar.TintColor = colorTint;
            navigationBar.SetTitleTextAttributes (new UITextAttributes {
                TextColor = UIColor.FromRGB (13, 19, 26)
            });
        }

        private bool isRootViewModel()
        {
            return NavigationController.ViewControllers.Length < 2; // Every view, even the RootView, is counted here.
        }

    private void addNavigationBarItemForMenu()
    {
        var sidebarButton = new UIBarButtonItem (
            UIImage.FromFile ("menu_icon.png"),
            UIBarButtonItemStyle.Plain,
            (object sender, EventArgs e) => {
                (UIApplication.SharedApplication.Delegate as AppDelegate).RootViewController.SidebarController.ToggleMenu();
            }
        );

        NavigationItem.SetLeftBarButtonItem (sidebarButton, true);
    }

    public virtual void NavigateToView (UIViewController controller)
    {
        (UIApplication.SharedApplication.Delegate as AppDelegate).RootViewController.NavigateToView (controller);
    }
}

对我来说,它正在发挥作用。我不确定您的问题在哪里,但这是我的代码:

[Register ("AppDelegate")]
    public partial class AppDelegate : MvxApplicationDelegate
    {
        UIWindow window;

        public RootViewController RootViewController { get { return window.RootViewController as RootViewController; } }

        public override bool FinishedLaunching (UIApplication app, NSDictionary options)
        {
            window = new UIWindow(UIScreen.MainScreen.Bounds);

            var presenter = new Presenter(this, window);

            var setup = new Setup(this, presenter);
            setup.Initialize();

            var startup = Mvx.Resolve<IMvxAppStart>();
            startup.Start();

            window.MakeKeyAndVisible();

            return true;
        }
    }
对于根控制器:

public class RootViewController: UIViewController, IMvxCanCreateTouchView
    {
        public SidebarController SidebarController { get; private set; }
        private UIViewController root;

        public RootViewController (UIViewController root)
        {
            this.root = root;
        }

        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            var menuContentView = this.CreateViewControllerFor<MenuViewModel> () as MenuViewController;
            SidebarController = new SidebarController (this, root, menuContentView) {
                MenuLocation = SidebarController.MenuLocations.Left,
                HasShadowing = false
            };
        }

        public void NavigateToView (UIViewController view)
        {
            SidebarController.ChangeContentView (new UINavigationController (view));
        }
    }
作为其他控制器的基类,我有:

public interface IControllerWithCustomNavigation
    {
        void NavigateToView (UIViewController controller);
    }

public class BaseController<TViewModel>: MvxViewController where TViewModel: BaseViewModel
    {
        protected bool NavigationBarEnabled = true;

        public new TViewModel ViewModel {
            get { return (TViewModel)base.ViewModel; }
            set { base.ViewModel = value; }
        }

        public BaseController (string nib) : base (nib, null)
        {
        }

        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            if (NavigationBarEnabled) {
                NavigationController.NavigationBarHidden = false;

                updateNavigationBar ();

                if (isRootViewModel()) {
                    addNavigationBarItemForMenu ();
                }
            } else if (NavigationController != null) {
                NavigationController.NavigationBarHidden = true;
            }
        }

        private void updateNavigationBar()
        {
            var navigationBar = NavigationController.NavigationBar;

            var colorTint = UIColor.FromRGB (133, 231, 110);
            var colorWhite = UIColor.White;

            navigationBar.BarTintColor = colorWhite;
            navigationBar.TintColor = colorTint;
            navigationBar.SetTitleTextAttributes (new UITextAttributes {
                TextColor = UIColor.FromRGB (13, 19, 26)
            });
        }

        private bool isRootViewModel()
        {
            return NavigationController.ViewControllers.Length < 2; // Every view, even the RootView, is counted here.
        }

    private void addNavigationBarItemForMenu()
    {
        var sidebarButton = new UIBarButtonItem (
            UIImage.FromFile ("menu_icon.png"),
            UIBarButtonItemStyle.Plain,
            (object sender, EventArgs e) => {
                (UIApplication.SharedApplication.Delegate as AppDelegate).RootViewController.SidebarController.ToggleMenu();
            }
        );

        NavigationItem.SetLeftBarButtonItem (sidebarButton, true);
    }

    public virtual void NavigateToView (UIViewController controller)
    {
        (UIApplication.SharedApplication.Delegate as AppDelegate).RootViewController.NavigateToView (controller);
    }
}

因此,在查看了发布的代码之后,实际上对他以前的文章进行了一些窥探,我决定最好创建我自己的MvxViewPresenter,到目前为止它还可以工作

public class SideBarControllerTouchViewPresenter : MvxModalSupportTouchViewPresenter
{
    private UIWindow _window;

    public SidebarController SidebarController {
        get ;
        set ;
    }

    public UIViewController RootController {
        get;
        private set;
    }

    public SideBarControllerTouchViewPresenter (UIApplicationDelegate applicationDelegate, UIWindow window) 
        : base(applicationDelegate, window)
    {
        _window = window;
    }

    public override void ChangePresentation (Cirrious.MvvmCross.ViewModels.MvxPresentationHint hint)
    {
        base.ChangePresentation (hint);
    }

    protected override void ShowFirstView (UIViewController viewController)
    {
        base.ShowFirstView (viewController);
    }

    protected override UINavigationController CreateNavigationController (UIViewController viewController)
    {

        var navController = new UINavigationController (viewController);
        var menuController = UIStoryboard.FromName ("storyboard", null).InstantiateViewController ("MenuTableViewController") as MenuTableViewController;
        RootController = new UIViewController ();
        SidebarController = new SidebarController (this.RootController, navController, menuController);
        return navController;
    }

    protected override void SetWindowRootViewController (UIViewController controller)
    {
        _window.AddSubview (RootController.View);
        _window.RootViewController = RootController;
    }
}

谢谢你把我带到那里

因此,在查看了发布的代码之后,我对他以前的文章进行了一些窥探,我决定最好创建我自己的MvxViewPresenter,目前为止它还可以工作

public class SideBarControllerTouchViewPresenter : MvxModalSupportTouchViewPresenter
{
    private UIWindow _window;

    public SidebarController SidebarController {
        get ;
        set ;
    }

    public UIViewController RootController {
        get;
        private set;
    }

    public SideBarControllerTouchViewPresenter (UIApplicationDelegate applicationDelegate, UIWindow window) 
        : base(applicationDelegate, window)
    {
        _window = window;
    }

    public override void ChangePresentation (Cirrious.MvvmCross.ViewModels.MvxPresentationHint hint)
    {
        base.ChangePresentation (hint);
    }

    protected override void ShowFirstView (UIViewController viewController)
    {
        base.ShowFirstView (viewController);
    }

    protected override UINavigationController CreateNavigationController (UIViewController viewController)
    {

        var navController = new UINavigationController (viewController);
        var menuController = UIStoryboard.FromName ("storyboard", null).InstantiateViewController ("MenuTableViewController") as MenuTableViewController;
        RootController = new UIViewController ();
        SidebarController = new SidebarController (this.RootController, navController, menuController);
        return navController;
    }

    protected override void SetWindowRootViewController (UIViewController controller)
    {
        _window.AddSubview (RootController.View);
        _window.RootViewController = RootController;
    }
}

谢谢你把我带到那里

谢谢你的代码,我来看看。看起来您的UI使用的是XIB,而我的UI在故事板中。我知道这不重要,但这是我能找到的大多数代码之间唯一的区别。谢谢你的代码,我会看一下。看起来您的UI使用的是XIB,而我的UI在故事板中。我知道这不重要,但这是我能找到的大多数代码之间的唯一区别。我花了一段可怕的时间让这些东西工作,但我没有使用XIB或故事板。。。我还需要一个自定义的演示者吗?我正在经历一段可怕的时间来让这些东西工作,但我没有使用XIB或故事板。。。我还需要自定义演示者吗?