我还在逐步了解这些东西。虽然还远远不够,但是......我有一个通过Xcode创建的TabBar应用程序。它可以工作,我有三个选项卡视图,我知道如何操纵等。
我想在整个应用程序前面放置一个“登录”nib文件,要求用户回答(现在是硬编码的)用户名和密码。如果你回答正确,那么就呈现选项卡部分,让他们点击浏览。
我有另一个应用程序,已经完成了用户名和密码部分,但我无法将其逻辑提取出来,放在TabApplication前面。
有人有什么建议吗?
我还在逐步了解这些东西。虽然还远远不够,但是......我有一个通过Xcode创建的TabBar应用程序。它可以工作,我有三个选项卡视图,我知道如何操纵等。
我想在整个应用程序前面放置一个“登录”nib文件,要求用户回答(现在是硬编码的)用户名和密码。如果你回答正确,那么就呈现选项卡部分,让他们点击浏览。
我有另一个应用程序,已经完成了用户名和密码部分,但我无法将其逻辑提取出来,放在TabApplication前面。
有人有什么建议吗?
在您的AppDelegate中,在application didFinishLaunchingWithOptions
方法的末尾,您会看到以下内容:
[window addSubview:tabcontroller.view];
[window makeKeyAndVisible];
return YES;
只需初始化您的登录视图控制器并在选项卡控制器之后添加它即可,例如:
initialScreenViewController = [[InitialScreenViewController alloc] init];
[window addSubview:tabcontroller.view];
[window addSubview:initialScreenViewController.view];
[window makeKeyAndVisible];
return YES;
在您的登录视图控制器中,验证用户后,可以通过以下方式隐藏它:
[self.parentViewController.view setHidden:YES];
如果您有一个注销功能,那么它允许您重新显示它。
标准的方法如下:
UIViewController
子类来管理它。在应用程序委托的application:didFinishLaunchingWithOptions:
方法中以模态方式呈现该视图,调用:
LoginController*loginController= ... ; // create the view controller for the login screen
[self.tabController presentModalViewController:loginController animated:YES];
这样,过渡期间的动画等内容将自动处理。
您可以在成功登录后稍后解除它。可以从LoginController
内部完成。
[self.parentViewController dismissModalViewControllerAnimated:YES];
然而,通常在登录完成后我需要进行其他设置。所以,我会先告诉应用程序代理登录已完成,然后执行其他操作。
[self.tabController dismissModalViewControllerAnimated:YES];
我可以从应用程序委托中调用任务,然后在那里执行其他任务。
要向应用程序委托通信,我将使用NSNotification
,但这可能对您来说有点困难。
一种可能更容易理解(但我觉得不太好看)的方法是在应用程序委托中定义一个方法,比如说loginDone
。然后,在LoginViewController
内部,您可以执行以下操作:
MyAppDelegate*appDelegate=[[UIApplication sharedApplication] delegate];
[appDelegate loginDone];
[self.tabController dismissModalViewControllerAnimated:YES]
。你可以在LoginViewController
的方法内部执行[self.parentViewController dissmissModalViewControllerAnimcated:YES]
,但无论如何,你都需要告诉应用程序委托你已经成功登录了。我更喜欢从应用程序委托中解除它。 - YujipresentModalViewController
已经被弃用,请使用 [self.tabController presentViewController:self.loginController animated:YES completion:nil];
代替。在这种情况下,动画效果看起来不太好,因为必须先显示 tabController
,只有在它出现在屏幕上后才能呈现 loginController
。所以我更喜欢传递 animated:NO
。 - Stas[window addSubview:tabBarController.view];
替换为[window addSubview:/*您称为带有密码内容的视图的任何内容*/];
[passView removeFromSuperview];
[window addSubview:tabBarController.view];
这样就可以进入常规标签栏应用程序了。
FirstViewController *viewController1 = [[FirstViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
SecondViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
ThirdViewController *viewController3 = [[ThirdViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
UINavigationController *navController1 = [[UINavigationController alloc] initWithRootViewController:viewController1];
UINavigationController *navController2 = [[UINavigationController alloc] initWithRootViewController:viewController2];
UINavigationController *navController3 = [[UINavigationController alloc] initWithRootViewController:viewController3];
self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = @[navController1, navController2, navController3];
LoginViewController *loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
UINavigationController *loginNavController = [[UINavigationController alloc] initWithRootViewController:loginViewController];
self.window.rootViewController = loginNavController;
然后在收到验证回调之后,您可以在您的应用程序代理中添加以下内容:
- (void)setAuthenticatedState:(BOOL)authenticated
{
if (authenticated == YES) {
dispatch_async(dispatch_get_main_queue(), ^(){
self.window.rootViewController = self.tabBarController;
});
}else{
// Stuff
}
}