0

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

  1. 当我加载我的应用程序(第一个 ViewController)时,我需要 if(FB 登录 = 成功)它会自动跳转到第二个 ViewController。在这里我想我不能使用UINavigationControllerlike root,苹果的HIG不喜欢它。 图 1
  2. 我需要一个UITabBarController连接到 3的UICollectionViewControllers(每个选项卡一个)。我必须把UITabBarControllerlike root?如果是,我该如何处理它们之间的其他 Viewontroller?像这样: 图 2
  3. 我需要每个 CollectionViewController 上的自定义 BarButtonItem(如您可以在图像 2 上看到的“全部删除”),我需要UINavigationController为每个控件使用一个吗?
4

1 回答 1

3

假设您很乐意使用 unwind segues(如果没有的话,有很多方法可以不用)。

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

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

你的第二个 VC(让我们称之为你的 startVC)
——应该包含在导航控制器
中——在导航控制器的身份检查器中,分配一个故事板 ID:@"InitialNavController"

在您的 App Delegate 中,让我们有一个loggedInBOOL 属性:

@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 将不起作用。

做一个 unwind Segue(并在loginVC's中声明它@interface)......如果用户注销,loginVC 将是目标 VC。

- (IBAction)unwindOnLogout:(UIStoryboardSegue *)segue 
{
    [(AppDelegate*)[[UIApplication sharedApplication] delegate] setLoggedIn:NO];

}

更正 - 删除了这一行:
[[self presentedViewController] dismissViewControllerAnimated:YES completion:nil];
我们不需要解雇,因为 segue 已经在幕后完成了。这是多余的并记录错误消息

在其他视图控制器中,您可以在适当的地方创建一个“注销”按钮。按住 CTRL 键从该按钮拖动到情节提要中 ViewController 底部的“退出”符号,您将能够选择此转场作为展开转场。

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

我认为您正在尝试弄清楚 tabBarController 与上一个 viewController (startVC) 中的 NavigationController 的关系。答案是,它不应该——你真的不想将 Tab Bar VC 嵌入到以前的 Nav Controller 中,因为它会为 Tab Bar 的子 viewControllers 创建奇怪的情况。

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

您可以在 startVC 中进行另一个展开 Segue 以方便从 tabBarController 的 viewControllers 中返回:

- (IBAction)unwindToInitialNavFromModal:(UIStoryboardSegue *)segue {

}

更正 - 删除了这一行:   [[self presentedViewController] dismissViewControllerAnimated:YES completion:nil];   此方法不需要任何内容​​来执行解雇

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

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

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

两者都可以,这实际上只取决于您是否想要导航到其他 ViewController。

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

在此处输入图像描述

于 2013-03-16T20:03:35.070 回答