TabBarControllers与NavigationControllers混合的难度

时间:2016-08-24 15:39:34

标签: ios uinavigationcontroller uitabbarcontroller uinavigationitem

我有一个Xamarin.iOS应用程序,我有以下结构:

  

NavController(root:登录)

     

- > TabBarController(主页) - (搜索) - (配置文件)

     

------> NavController(root:Home)

     

-------------> TableController

     

-----------------> DetailController

     

------> NavController(root:Search)

     

...等

我目前在使用导航项目时遇到了困难,特别是后退按钮项目。

我永远不想通过后退按钮返回登录页面,因此在我的HomeController中,我隐藏back button

TabBarController.NavigationItem.HidesBackButton = true;

当我转到下一个屏幕(TableController)时,我想看到返回HomeController的后退按钮,但是我当前的方法有Login的后退按钮控制器

this.TabBarController.NavigationItem.HidesBackButton = false;

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

对于你想要的效果,我建议你创建一个对象(我使用“RootController”作为例子)来管理应用程序的Window.RootController。

我不知道你是否对改变窗口的RootController有一些经验,所以请按照我的步骤进行:

首先创建一个新项目,删除storyboard和Viewcontroller.cs。(不要忘记在info.plist中删除storyboard的包)

然后重写你的AppDelegate.cs,如下所示:

[Register ("AppDelegate")]
public class AppDelegate : UIApplicationDelegate
{
    UIWindow window;

    public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
    {
        // create a new window instance based on the screen size
        window = new UIWindow (UIScreen.MainScreen.Bounds);
        window.RootViewController = RootController.Instance.LoginController;
        window.MakeKeyAndVisible ();

        return true;
    }

    public override void OnResignActivation (UIApplication application)
    {
        // Invoked when the application is about to move from active to inactive state.
        // This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) 
        // or when the user quits the application and it begins the transition to the background state.
        // Games should use this method to pause the game.
    }

    public override void DidEnterBackground (UIApplication application)
    {
        // Use this method to release shared resources, save user data, invalidate timers and store the application state.
        // If your application supports background exection this method is called instead of WillTerminate when the user quits.
    }

    public override void WillEnterForeground (UIApplication application)
    {
        // Called as part of the transiton from background to active state.
        // Here you can undo many of the changes made on entering the background.
    }

    public override void OnActivated (UIApplication application)
    {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. 
        // If the application was previously in the background, optionally refresh the user interface.
    }

    public override void WillTerminate (UIApplication application)
    {
        // Called when the application is about to terminate. Save data, if needed. See also DidEnterBackground.
    }
}

这是RootController.cs,它包含一个UINavigationController和一个UITabBarController(Home - Search - Profile):

public class RootController
{
    private static RootController instance;
    public static RootController Instance {
        get {
            if (instance == null)
                instance = new RootController ();
            return instance;
        }
    }

    private static UINavigationController loginController;
    public UINavigationController LoginController {
        get {
            if (loginController == null)
                InitLoginController ();
            return loginController;
        }
    }

    private void InitLoginController()
    {
        UIViewController loginViewController = new UIViewController (){ Title = "LoginController" };
        loginViewController.View.Frame = UIScreen.MainScreen.Bounds;
        loginViewController.View.BackgroundColor = UIColor.Red;
        loginViewController.NavigationItem.SetRightBarButtonItem (new UIBarButtonItem ("MainTab",UIBarButtonItemStyle.Done, delegate {
            UIApplication.SharedApplication.KeyWindow.RootViewController = RootController.Instance.MainTabController;
        }),true);
        loginController = new UINavigationController (loginViewController);
    }

    private static UITabBarController mainTabController;
    public UITabBarController MainTabController {
        get {
            if (mainTabController == null)
                InitMainTabController ();
            return mainTabController;
        }
        set {
            mainTabController = value;
        }
    }

    private void InitMainTabController ()
    {
        mainTabController = new UITabBarController ();
        mainTabController.ViewControllers = new UIViewController [] {
            new UINavigationController(new HomeViewController() {
                TabBarItem = new UITabBarItem (UITabBarSystemItem.Favorites,0)
            }),
            new UINavigationController (new UIViewController ()
                {
                    Title = "SearchController",
                    TabBarItem = new UITabBarItem (UITabBarSystemItem.Search,1)
                }),
            new UINavigationController (new UIViewController ()
                {
                    Title = "ProfileController",
                    TabBarItem = new UITabBarItem (UITabBarSystemItem.More,2)
                })
        };

        mainTabController.SelectedIndex = 0;
    }
}

这是HomeController.cs,可以根据需要推送UITableViewController,如果需要还有一个返回LoginController的按钮:

public class HomeViewController : UIViewController
{
    public HomeViewController ()
    {
        Title = "HomeController";
        this.View.Frame = UIScreen.MainScreen.Bounds;
        this.View.BackgroundColor = UIColor.Green;

        //Set a button to return to loginController
        this.NavigationItem.SetLeftBarButtonItem (new UIBarButtonItem ("LoginC",UIBarButtonItemStyle.Done, delegate {
            UIApplication.SharedApplication.KeyWindow.RootViewController = RootController.Instance.LoginController;
        }),true);

        //Set a button to go to tableController
        UITableViewController tableViewController = new UITableViewController (){ Title = "TableViewController" };
        tableViewController.View.Frame = UIScreen.MainScreen.Bounds;
        tableViewController.View.BackgroundColor = UIColor.White;
        tableViewController.HidesBottomBarWhenPushed = true;//To make tabbar disappear
        this.NavigationItem.SetRightBarButtonItem (new UIBarButtonItem ("TableView",UIBarButtonItemStyle.Done, delegate {
            this.NavigationController.PushViewController(tableViewController,true);
        }),true);
    }
}

您可以在RootController.cs中添加自己的ViewController,而不是我的样本控制器。

如果你还有一些问题,请把它放在这里,我会检查一下。

希望它可以帮到你。