【问题标题】:Sidemenu not closing - Xamarin.iOS侧边菜单未关闭 - Xamarin.iOS
【发布时间】:2017-04-21 01:46:18
【问题描述】:

我正在尝试使用 componentexample 在 Xamarin.iOS 中实现侧边菜单。 除了我要关闭侧边菜单的部分之外,一切正常。

现在它的工作原理是这样的:我可以使用 NavigationItem 中的 LeftButton 或手指滑动来打开侧边菜单。但是我不能用这两种方法中的任何一种来关闭它。

有人知道为什么会这样吗?我错过了什么?

另请参阅下面的代码。

主视图

public partial class HomeView : MvxViewController
{
    public HomeView() : base("HomeView", null)
    {
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        // Perform any additional setup after loading the view, typically from a nib.

        CGRect screenRect = UIScreen.MainScreen.Bounds;
        NavigationController.View.Frame = new CGRect(0, 0, screenRect.Width, screenRect.Height);

        var app = UIApplication.SharedApplication.Delegate as AppDelegate;
        NavigationItem.SetLeftBarButtonItem(
            new UIBarButtonItem(UIImage.FromBundle("menu"),
                                UIBarButtonItemStyle.Plain, (sender, e) =>
                                {
                                    app.SidebarController.ToggleMenu();
                                }), true);
    }

根视图

public partial class RootView : MvxViewController
{
    public RootViewModel RootViewModel
    {
        get { return (RootViewModel)ViewModel; }
        set { ViewModel = value; }
    }

    public RootView() : base("RootView", null)
    {
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        // Perform any additional setup after loading the view, typically from a nib.

        if (ViewModel == null)
            return;

        var app = UIApplication.SharedApplication.Delegate as AppDelegate;
        app.SidebarController = new SidebarController(this,
                                                  CreateViewFor(RootViewModel.Home, false), CreateViewFor(RootViewModel.Menu, true));
        app.SidebarController.MenuWidth = 220;
        app.SidebarController.ReopenOnRotate = false;
        app.SidebarController.MenuLocation = MenuLocations.Left;
    }

    public override void DidReceiveMemoryWarning()
    {
        base.DidReceiveMemoryWarning();
        // Release any cached data, images, etc that aren't in use.
    }

    private UIViewController CreateViewFor(IMvxViewModel viewModel, bool navBarHidden)
    {
        var controller = new UINavigationController();
        var screen = this.CreateViewControllerFor(viewModel) as UIViewController;
        controller.PushViewController(screen, false);
        controller.NavigationBarHidden = navBarHidden;
        return controller;
    }

【问题讨论】:

  • 我不知道你的代码有什么问题。但是我在我的项目中使用了侧边栏导航,它运行得很好。如果你愿意,我可以发布我的代码
  • 您也将它与 MVVMCross 一起使用?
  • 当我继续对此进行调查时,我发现 RootViewController 位于其他两个控制器(Menu 和 Home ViewControler)之上,它确实阻止了这两个控制器上的所有交互/事件。

标签: ios xamarin xamarin.ios


【解决方案1】:

我设法通过在 RootView.cs 的 ViewDidLoad() 中添加以下行来修复奇怪的行为:

View.Frame = new CGRect(0, 0, 0, 0);

由于某种原因,来自 RootViewController 的视图看起来高于其他两个视图,这是我设法使其工作的唯一方法。如果有人有更好的解决方案,请添加您的答案,我会尝试。我所做的看起来更像是一种解决方法。

@HeisenBerg 我们的项目之间有一个区别,我使用的是 MVVMCross,它会更多地改变屏幕之间的流程。不过谢谢你的帮助!

【讨论】:

    【解决方案2】:

    这就是我在我的应用中实现侧边栏导航的方式,并且效果很好。

    RootViewController.cs

    public class RootViewController : UIViewController
    {
        UIStoryboard _storyboard;
    
        // the sidebar controller for the app
        public SidebarController LeftSidebarController { get; private set; }
    
        // the navigation controller
        public NavigationController NavController { get; private set; }
    
        // the storyboard
        public override UIStoryboard Storyboard {
            get {
                if (_storyboard == null)
                    _storyboard = UIStoryboard.FromName ("Main", null);
                return _storyboard;
            }
        }
    
        public RootViewController () : base (null, null)
        {
    
        }
    
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();
    
            var programController = (CareProgramController)Storyboard.InstantiateViewController ("careProgramController"); // This is the menu..
            var leftMenuController = (LeftMenuController)Storyboard.InstantiateViewController ("leftMenuController"); // This is the initial ViewController
            NavController = new NavigationController ();
            NavController.PushViewController (programController, false);
            LeftSidebarController = new SidebarController (this, NavController, leftMenuController) {
                HasShadowing = false,
                MenuWidth = 280,
                MenuLocation = MenuLocations.Left
            };
        }
    }
    

    BaseViewController.cs

    public class BaseViewController : UIViewController
    {
    
        // provide access to the sidebar controller to all inheriting controllers
        protected SidebarNavigation.SidebarController SidebarController {
            get {
                return (UIApplication.SharedApplication.Delegate as AppDelegate).RootViewController.LeftSidebarController;
            }
        }
    
        // provide access to the navigation controller to all inheriting controllers
        protected NavigationController NavController {
            get {
                return (UIApplication.SharedApplication.Delegate as AppDelegate).RootViewController.NavController;
            }
        }
    
        // provide access to the storyboard to all inheriting controllers
        public override UIStoryboard Storyboard {
            get {
                return (UIApplication.SharedApplication.Delegate as AppDelegate).RootViewController.Storyboard;
            }
        }
    
        public BaseViewController (IntPtr handle) : base (handle)
        {
        }
    
    
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();
            SetupNavigationBar ();
            SetDrawerToogle ();
        }
    
        void SetupNavigationBar ()
        {
            if (NavController != null) {
                NavController.NavigationBar.BarTintColor = AZConstants.PrimaryColor;
                NavController.NavigationBar.Translucent = false;
                NavController.NavigationBar.TintColor = UIColor.White;
                NavController.NavigationBar.BarStyle = UIBarStyle.Black;
            }
        }
    
        void SetDrawerToogle ()
        {
            NavigationItem.SetLeftBarButtonItem (
                new UIBarButtonItem (UIImage.FromFile ("ic_menu_white.png").ImageWithRenderingMode (UIImageRenderingMode.AlwaysOriginal)
                    , UIBarButtonItemStyle.Plain
                    , (sender, args) => {
                        SidebarController.ToggleMenu ();
                    }), true);
        }
    }
    

    现在我的应用程序中的所有 ViewControllers 都从 BaseViewController 扩展,所以它会有一个导航抽屉

    AppDelegate.cs

    public class AppDelegate : UIApplicationDelegate
    {
        // class-level declarations
    
        public RootViewController RootViewController { get { return Window.RootViewController as RootViewController; } }
    
        public override UIWindow Window
        {
            get;
            set;
        }
    
        public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
        {
            // Override point for customization after application launch.
            // If not required for your application you can safely delete this method
            UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.LightContent, true);
    
            GotoRootViewController();
            return true;
        }
    
        public void GotoRootViewController()
        {
            Window = new UIWindow(UIScreen.MainScreen.Bounds);
            //Window.RootViewController.DismissViewController(true, null);
            //If you have defined a root view controller, set it here:
            Window.RootViewController = new RootViewController();
    
            // make the window visible
            Window.MakeKeyAndVisible();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-22
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多