2016-12-06 15 views
0

私はXamarin.iOSでこのメニューcomponentとこのexampleを使ってサイド・メニューを実装しようとしています。 サイドメニューを閉じる部分以外はすべて正常に機能しました。サイド・メニューが閉じない - Xamarin.iOS

これは次のように動作します:NavigationItemの左ボタンまたは指のスワイプを使用してサイドメニューを開くことができます。しかし、私はこれらの2つの方法のいずれかでそれを閉じることはできません。

これはなぜ起こっているのですか?私は何が欠けていますか?

以下のコードも参照してください。

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が他の2つのコントローラ(MenuおよびHome ViewControler)の上にあり、それらの2つのすべての相互作用/イベントをブロックしていることがわかりました。 –

答えて

0

私はRootView.csからのviewDidLoad()に以下の行を追加することによって、奇妙な行動を修正するために管理:

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

を、それは他の2を超えていたRootViewControllerからの眺めのように見えるいくつかの理由で、これがあるだけで私はそれがうまくいくように管理しました。誰かがより良い解決策を持っているなら、あなたの答えを加えてください。私はそれを試してみましょう。私がやったことは、回避策のように見えます。

@ HeeenBerg私たちのプロジェクトには1つの違いがあります。私は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); 
    } 
} 

それはナビゲーションの引き出しに

AppDelegate.csを持っていますので、今、私のアプリ内のすべてのViewControllersがBaseViewControllerから延び

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(); 
    } 
関連する問題