2016-12-06 11 views
0

Ich versuche, ein Seitenmenü in Xamarin.iOS mit diesem component und diesem example zu implementieren. Alles funktionierte gut außer dem Teil, wo ich das Side Menu schließen möchte.Sidemenu nicht schließen - Xamarin.iOS

Jetzt funktioniert es so: Ich kann das Seitenmenü entweder mit dem LeftButton von NavigationItem oder dem Finger Swipe öffnen. Aber ich kann es mit keiner dieser beiden Methoden schließen.

Hat jemand eine Idee, warum das passiert? Was vermisse ich?

Siehe auch folgenden Code.

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

Ich weiß nicht, was mit Ihrem Code falsch ist. Aber ich benutze Sidebar Navigation in meinem Projekt und es funktioniert sehr gut. Wenn du willst, kann ich meinen Code posten – HeisenBerg

+0

Du verwendest ihn auch mit MVVMCross? –

+0

Während ich dies zu untersuchen fortgesetzt, entdeckte ich, dass die RootViewController oben ist die anderen beiden Controller (Menü und Startseite ViewControler) und sie auf diese beiden alle die Interaktion/Ereignisse nicht zu blockieren. –

Antwort

0

habe ich es geschafft, indem Sie die Zeile unterhalb in ViewDidLoad() von RootView.cs das seltsame Verhalten zu beheben:

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

Aus irgendeinem Grund ist es von RootViewController wie der Blick sieht über den beiden anderen war und dies ist die einzige So habe ich es geschafft, es zum Laufen zu bringen. Wenn jemand eine bessere Lösung hat, bitte fügen Sie Ihre Antwort hinzu und ich werde es versuchen. Was ich getan habe, sieht eher wie ein Workaround aus.

@HeisenBerg Es gibt einen Unterschied zwischen unseren Projekten, ich bin mit MVVMCross, die ein bisschen mehr den Fluss zwischen den Bildschirmen ändert. Aber danke für deine Hilfe!

0

Dies ist, wie ich Sidebar Navigation in meiner App implementiert haben und die sehr gut funktioniert.

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

Nun sind alle Viewcontrollers in meiner App von BaseViewController erstreckt, so dass es eine Navigationsleiste

AppDelegate.cs haben werden

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