Xamarin的iOS NavigationController返回null [英] Xamarin iOS NavigationController returns null

查看:278
本文介绍了Xamarin的iOS NavigationController返回null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我还在学习中Xamarin的ios的绳索,并已实现了基于下面的例子 MonoTouch的一侧抽屉.SlideoutNavigation 。在本教程中,有一个主视图控制器类,然后指定一个主导航控制器和侧面菜单。

I'm still learning the ropes in Xamarin ios and have implemented a side drawer based on the following example Monotouch.SlideoutNavigation. In this tutorial,there's a main view controller class which then assigns a main navigation controller and a side menu.

抽屉菜单选项被送入菜单类,而主屏幕/第一屏被传递到主导航控制器类,这是一个UINavigationController类的子类

The drawer menu options are fed into the menu class while the "home screen/first screen" is passed onto the main navigation controller class which is a subclass of a UINavigationController class.

我的主屏幕是一个tabcontroller类,我试图让这个类里面的导航控制器的引用,但它总是返回null。

My home screen is a tabcontroller class and I'm trying to make a reference to the navigation controller inside this class but it always returns null.

这是我面临着两个挑战:

These are the two challenges I'm facing:


  • 导航控制器选项​​卡控制器和单个标签视图控制器里面总是空

  • 我的个人标签控制器类的标题不会在导航栏上显示。

下面是在 AppDelegate类

[Register ("AppDelegate")]
public class AppDelegate : UIApplicationDelegate
{
        public SlideoutNavigationController Menu { get; private set; }

 public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
    {
                Menu = new SlideoutNavigationController ();

 var tabBarController = GetViewController (Main, "MainTabBarController");

                Menu.MainViewController = new MainNavigationController (tabBarController, Menu);
                Menu.MenuViewController = new MenuNavigationController (new MenuControllerLeft (), Menu) { NavigationBarHidden = true };
                SetRootViewController (Menu, false);

        return true;
    }
}



的MainTabController类

 public partial class MainTabBarController : UITabBarController
{
        UINavigationItem titleRequest,titleHome,titleSell;

  public MainTabBarController (IntPtr handle) : base (handle)
    {
  //Create an instance of our AppDelegate
         appDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

        //Get an instance of our Main.Storyboard
        var mainStoryboard = appDelegate.Main;

        var tab1 = appDelegate.GetViewController (mainStoryboard, "Tab1");

        var tab2 = appDelegate.GetViewController (mainStoryboard, "Tab2");

        var tab3 = appDelegate.GetViewController (mainStoryboard, "Tab3");


        var tabs = new UIViewController[] {
            tab1, tab2, tab3
        };

        this.SelectedIndex = 1;
        ViewControllers = tabs;
  }

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


            if(this.SelectedIndex == 0)
            {

                titleRequest = new UINavigationItem ("TAB 1");
                this.NavigationController.NavigationBar.PushNavigationItem (titleRequest, true); // NavigationController here is null

            }else if(this.SelectedIndex == 1)
            {
                titleHome = new UINavigationItem ("TAB 2");
                this.NavigationController.NavigationBar.PushNavigationItem (titleHome, true);


            }else{

                titleSell = new UINavigationItem ("TAB 3");
                this.NavigationController.NavigationBar.PushNavigationItem (titleSell, true);
            }

  }
 }



在主导航控制器类

 public class MainNavigationController : UINavigationController
{

 public MainNavigationController(UIViewController rootViewController, SlideoutNavigationController slideoutNavigationController)
        : this(rootViewController, slideoutNavigationController, 

            new UIBarButtonItem(UIImage.FromBundle("icon_sidemenu.png"), UIBarButtonItemStyle.Plain, (s, e) => {}))
    {
    }
  public MainNavigationController(UIViewController rootViewController, SlideoutNavigationController slideoutNavigationController, UIBarButtonItem openMenuButton)
        : base(rootViewController)
    {
        openMenuButton.Clicked += (s, e) => slideoutNavigationController.Open(true);
        rootViewController.NavigationItem.LeftBarButtonItem = openMenuButton;
    }

   public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        this.Delegate = new NavigationControllerDelegate();
        InteractivePopGestureRecognizer.Enabled = true;

    }
   public override void PushViewController(UIViewController viewController, bool animated)
    {
        // To avoid corruption of the navigation stack during animations disabled the pop gesture
        if (InteractivePopGestureRecognizer != null)
            InteractivePopGestureRecognizer.Enabled = false;
        base.PushViewController(viewController, animated);
    }

    private class NavigationControllerDelegate : UINavigationControllerDelegate
    {
        public override void DidShowViewController(UINavigationController navigationController, UIViewController viewController, bool animated)
        {
            // Enable the gesture after the view has been shown
            navigationController.InteractivePopGestureRecognizer.Enabled = true;
        }
    }
}

修改 - 结果使得由Jason以下建议更改后

后imgur.com/AI7UY.jpgALT =标签消失
可能有人帮我看看有什么我做错了。

Could someone help me see what I'm doing wrong.

推荐答案

我终于找到了解决这个工作。对于使用Dillan的解决方案,并具有TabBarController类菜单类之一,这里就是我得到了它的工作的人。

I finally found a work around this. For anyone using Dillan's solution and has a TabBarController class as one of the Menu classes, here's how I got it to work.


  1. 我从MainNavigationController类包裹TabBarController类在NavigationController,分开。我没有包裹在它自己的NavigationController每个选项卡this.That解决TabBarController类中的空引用到NavigationController后

  1. I wrapped the TabBarController class in a NavigationController,apart from the MainNavigationController class. I didn't have to wrap each tab in it's own NavigationController after this.That solves the null reference to the NavigationController inside the TabBarController class

要解决的标题被遮蔽每个选项卡里面,我发现了一个简单的解决方案:

To solve the titles being obscured inside each tab, I found a simple solution:

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

    try{

            this.ViewControllerSelected += (object sender, UITabBarSelectionEventArgs e) => {

            switch(TabBar.SelectedItem.Title)
            {
            case"TAB 1" :

                Title = "TAB 1";
                break;

            case "TAB 2":   
              Title = "TAB 2";
                break;

            default:
                Title = "TAB 3";
                break;
            }
        };


    }catch(Exception e)
    {
        Console.WriteLine (e.Message);
    }
}


这篇关于Xamarin的iOS NavigationController返回null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆