2016-12-06 40 views
0

我试图用这个componentexample以实现Xamarin.iOS一个侧面菜单。 一切工作正常,除了我想关闭侧面菜单的部分。Sidemenu不打烊 - Xamarin.iOS

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

有没有人知道为什么会发生这种情况?我错过了什么?

另请参阅下面的代码。

HomeView

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); 
    } 

RootView

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; 
    } 
+0

我不知道你的代码有什么问题。但是我在我的项目中使用了侧栏导航,它工作得很好。如果你想,我可以发布我的代码 – HeisenBerg

+0

你也用MVVMCross? –

+0

当我继续调查这一点时,我发现RootViewController位于其他两个控制器(Menu和Home ViewControler)的顶部,并且它阻止了这两者之间的所有交互/事件。 –

回答

0

我设法从RootView.cs添加行下面的viewDidLoad中()来修复奇怪的行为:

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

出于某种原因,它看起来像从RootViewController的观点是其他两个以上,这是唯一的我设法使它工作。如果有人有更好的解决方案,请添加您的答案,我会尝试。我所做的更像是一种解决方法。

@HeisenBerg有我们的项目之间的一个区别,我使用MVVMCross,这改变了一下多个屏幕之间的流动。但是谢谢你的帮助!

0

这是怎么了,我实现了侧栏导航在我的应用程序和它工作得很好。

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(); 
    }