1

我有一个以 LoginViewController 作为初始视图的应用程序。

注意:所以在 appDelegate.m 中,self.window.rootViewController 不是 TabBarController。 在此处输入图像描述

在 Auth 之后,我展示了应用程序的主要部分,它有一个 tabbarController (identifier:tabBar) 和两个选项卡,一个选项卡有一个导航控制器。我正在使用Core Data,所以我需要通过MOC。

如果我使用,

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UITabBarController *obj=[storyboard instantiateViewControllerWithIdentifier:@"tabBar"];
[obj setSelectedIndex:0];// Which tab to show first
[self presentModalViewController:obj animated:YES];

它在视觉上效果很好。现在我需要通过 MOC。阅读 PrepareToSegue 方法,创建一个从 loginVC 到我的 TargetViewController (TabBar>NavigationController1>View1) 的 segue(模态,图中未显示),将 segue 命名为“LoginSegue”并使用以下代码:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UINavigationController *navController = (UINavigationController *)[segue destinationViewController];
View1 *devicelist = (View1 *)[[navController viewControllers] lastObject];
devicelist.managedObjectContext = managedObjectContext;
}

TabBar 不显示。在这种情况下如何设置标签栏控制器?

我一直在尝试获取 Modal Tabbar 的参考资料,但仍不清楚。有人可以用外行的方式解释如何处理这种情况吗?

4

1 回答 1

0

我认为最好使用不使用模式转换到标签栏控制器的设计。模态演示通常应该是为了中断应用程序的正常流程,而不是为了让你的主控制器出现在屏幕上。有两种选择,我认为更好。您可以将登录控制器保留为窗口的初始根视图控制器,然后将其切换为选项卡栏控制器(它将成为窗口的新根视图控制器,并且登录控制器将被释放)。这通常可以正常工作,但我认为在这种情况下,如果您想将 MOC 从应用程序委托(我假设)传递到选项卡栏控制器中的控制器,我认为第二种方法会更好。

第二种方法,也是我通常做登录控制器的方法,是让标签栏控制器成为窗口的根视图控制器,然后从初始视图的 viewDidAppear 方法模态地呈现登录控制器(这将成为你调用 View1 的那个)。如果您在动画设置为 NO 的情况下进行此演示,登录控制器将是用户首先看到的内容:

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    static int first = 1;
    if (first) {
        LoginViewController *login = [self.storyboard instantiateViewControllerWithIdentifier:@"Login"];
        [self presentViewController:login animated:NO completion:nil];
        first = 0;
    }
}

if 语句在那里,因此当您从登录控制器返回时,演示不会再次发生(您可以做一些更复杂的事情,例如从登录控制器返回 View1 的委托,表明如果您愿意,登录成功,但这有效)。

如果登录成功,您只需关闭登录控制器,您就会在您的第一个视图中出现(如果失败,您永远不会关闭它,并且可能会显示一条消息说登录失败)。

如果你走这条路线,那么你可以像这样在应用程序委托中传递 MOC:

UINavigationController *nav = [(UITabBarController *)self.window.rootViewController viewControllers][0];
View1 *devicelist = (View1 *)nav.viewControllers.lastObject;
devicelist.managedObjectContext = managedObjectContext;
于 2013-05-10T01:37:14.180 回答