我需要一个很好的解释如何使用StoryBoards处理iOS6.1上的 UINavigationControllers 和 UITabBarControllers 。
UINavigationController
这样的根,苹果的HIG不喜欢它。
UITabBarController
连接到3 UICollectionViewControllers
(每个{1}}一个标签。我必须把UITabBarController
像根一样?如果是,我如何处理它们之间的其他Viewontrollers?像这样:
UINavigationController
吗?答案 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键拖动到“退出”符号)。