假设您很乐意使用 unwind segues(如果没有的话,有很多方法可以不用)。
1 当我加载我的应用程序(第一个 ViewController)时,我需要 if(FB 登录 = 成功)它会自动跳转到第二个 ViewController。在这里我想我不能使用像 root 这样的 UINavigationController,苹果的 HIG 不喜欢它。
您的第一个 VC(我们称之为 loginVC)..
- 不应包含在导航控制器中。
- 应设置为应用程序的 initialViewController
你的第二个 VC(让我们称之为你的 startVC)
——应该包含在导航控制器
中——在导航控制器的身份检查器中,分配一个故事板 ID:@"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 将不起作用。
做一个 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 键拖动到“退出”符号)。