如何处理UINavigationControllers和UITabBarControllers iOS 6.1

时间:2013-03-14 03:45:21

标签: ios6 uinavigationcontroller uitabbarcontroller uibarbuttonitem uicollectionview

我需要一个很好的解释如何使用StoryBoards处理iOS6.1上的 UINavigationControllers UITabBarControllers

  1. 当我加载我的应用程序(第一个ViewController)时,我需要if(FB login = success)它会自动跳转到第二个ViewController的segues。在这里,我认为我不能使用像UINavigationController这样的根,苹果的HIG不喜欢它。 image 1
  2. 我需要UITabBarController连接到3 UICollectionViewControllers(每个{1}}一个标签。我必须把UITabBarController像根一样?如果是,我如何处理它们之间的其他Viewontrollers?像这样: Image 2
  3. 我需要在每个CollectionViewController上使用自定义BarButtonItem(如图2所示的“全部删除”),我需要为每个使用UINavigationController吗?

1 个答案:

答案 0 :(得分:3)

让我们假设你很乐意使用unwind segues(如果没有很多方法可以不用)。

  

1当我加载我的应用程序(第一个ViewController)时,我需要if(FB login = success)它会自动跳转到第二个ViewController的segues。在这里我想我不能像root那样使用UINavigationController,苹果的HIG不喜欢它。

你是第一个VC(我们称之为loginVC)..
- 不应包含在导航控制器中 - 应该设置为应用程序的initialViewController

你的第二个VC(我们称之为你的startVC)
- 应该包含在导航控制器中 - 在该导航控制器的Identity Inspector中,指定storyboardID:@"InitialNavController"

在你的App Delegate中,我们有一个loggedIn BOOL属性:

@property (nonatomic, assign) BOOL loggedIn;

现在,在你的LogInViewController ......

viewDidAppear中查看我们是否已登录,如果是,请立即导航至您的startVC:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    if ([(AppDelegate*)[[UIApplication sharedApplication] delegate] loggedIn]) {
        UINavigationController* navController = 
           [[self storyboard] instantiateViewControllerWithIdentifier:@"InitialNavController"];
        [self presentViewController:navController
                           animated:NO
                         completion:nil];
    }
}

重要的是将它放在viewDidAppear中,而不是(例如)在viewDidLoad中 - 除非初始视图已正确初始化并在屏幕上,否则segue将无法工作。

展开Segue(并在loginVC的{​​{1}}中声明)...如果用户退出,loginVC将成为目标VC。

@interface

更正 - 删除了这一行:
- (IBAction)unwindOnLogout:(UIStoryboardSegue *)segue { [(AppDelegate*)[[UIApplication sharedApplication] delegate] setLoggedIn:NO]; }
我们不需要解雇,因为segue已经在幕后完成了这项工作。这是多余的并记录错误消息

在其他viewControllers中,您可以选择“注销”按钮。 CTRL-从该按钮拖动到故事板中ViewController底部的“退出”符号,您将能够选择此segue作为展开segue。

  

2我需要一个连接到3个UICollectionViewControllers的UITabBarController(每个都有一个选项卡)。我必须像根一样把UITabBarController?如果是,我如何处理它们之间的其他Viewontrollers?像这样:

我认为你正在试图弄清楚tabBarController如何与之前的viewController(startVC)中的NavigationController相关。答案是,它不应该 - 你真的不想在前面的Nav控制器中嵌入Tab Bar VC,因为它会为Tab Bar的子viewControllers创建奇怪的情况。

从startVC到tabBarVC的导航应该通过模态segue,而不是push segue。

您可以在startVC中另外展开Segue以方便从tabBarController的viewControllers返回:

[[self presentedViewController] dismissViewControllerAnimated:YES
                                                         completion:nil];

更正 - 删除了这一行: - (IBAction)unwindToInitialNavFromModal:(UIStoryboardSegue *)segue { } 此方法不需要任何内容​​来执行解雇

  

3我需要在每个CollectionViewController上使用自定义BarButtonItem(就像你在图像2上看到的“全部删除”),我需要为每个使用一个UINavigationController吗?

默认情况下,您不会在tabBarVC中获得导航栏。

您可以提供两种方式中的一种 - 将每个子视图控制器嵌入其自己的导航控制器中;
- 手动将导航栏拖动到EACH子viewController的场景。

要么是好的,这实际上取决于你是否想要导航到其他ViewControllers。

然后,您可以在左侧或右侧添加barButtonItem以连接到initialVC的展开segue(按住CTRL键拖动到“退出”符号)。

enter image description here