【问题标题】:Display XIB before UITabBarController?在 UITabBarController 之前显示 XIB?
【发布时间】:2012-03-18 22:42:14
【问题描述】:

我面临这个问题几个月了,我不知道解决它的最佳解决方案是什么。问题是,我需要在我的 UITabBar 出现之前加载一个 XIB,更清楚的是,我有我的第一个视图是用户登录(不应该显示选项卡),当用户登录时,应用程序验证信息,之后应该使用 UITabBarController 加载视图,但每次我尝试这样做时都没有以模态方式显示登录视图,显示两个视图,登录视图和标签栏视图。

【问题讨论】:

  • 所以您不想显示模式视图来询问凭据?对吗?
  • 是的,我需要显示登录视图,但没有模态!

标签: iphone ios xcode uitabbar


【解决方案1】:

您可以先将 loginViewController 设置为主 windowrootViewController,然后在用户登录后,将 tabBarController 设置为 rootViewController

类似这样的东西(假设你的 loginViewController 是viewController1):

Appdelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    UIViewController *viewController1 = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
    UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    UINavigationController *myNav1=[[UINavigationController alloc] initWithRootViewController:viewController1];
    UINavigationController *myNav2=[[UINavigationController alloc] initWithRootViewController:viewController2];
    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:myNav1,myNav2, nil];
    //set the login view
    self.window.rootViewController = viewController1;
    [self.window makeKeyAndVisible];
    return YES;
}

-(void)setTabBar{
    //self.viewController1=nil;
    self.window.rootViewController = self.tabBarController;
}

然后从 loginViewController 调用 appDelegate 的方法setTabBar

LoginViewController.m
#import "AppDelegate.h"

-(void)loginOK{
   AppDelegate *del=(AppDelegate*)[[UIApplication sharedApplication] delegate];
   [del setTabBar];
   //you could add some animation transition between views
}

【讨论】:

  • ps:uinavigationcontrollers 是可选的。
  • 如果用户退出了怎么办?
  • @Maulik 创建另一个类似的方法,如setTabBar 并再次将 loginViewController 设置为 rootviewcontroller。然后在应用启动时使用 NSUserDefault 来检查用户是否已经登录。没那么难。
  • 我知道要重现与导航控制器弹出相同的效果并不容易,但是恕我直言,我认为不应该有注销动画,最多是淡出动画。这只是我的观点,但您始终可以访问 rootvc 的视图以及您正在显示的下一个 vc 的视图,因此您可以重新创建类似的 pop 效果。
【解决方案2】:

据我所知,UITabBarController 不能嵌入另一个viewController。考虑到这一点,您有以下选择:

  1. 呈现一个模态视图(你不想要的)

  2. 在启动时隐藏tabBar,验证凭据后,显示tabBar。但是有一个缺点:隐藏/显示tabBar 不能动画。

  3. 您可以仅使用一个 viewController 启动您的 UITabBarController - 将要求提供凭据的那个,一旦验证,将更多 viewControllers 添加到 UITabBarController(这将添加更多选项卡)。这也是您可以在某些应用程序中看到的行为,例如Bank of America (http://itunes.apple.com/us/app/bank-america-mobile-banking/id284847138?mt=8)

可能会有更好的做法。这些是我的建议。

【讨论】:

  • 是的,我已经尝试过了,但请记住,这样做,UITabBar 项目之一必须是我的登录视图,登录后应该从视图中删除!
  • 对。这就是我作为示例提到的应用程序的作用。当你启动它时,它有登录选项卡,一旦你登录,viewController 就会从 UITabBarController 中删除。
【解决方案3】:

作为一种简单的方法,将视图添加为窗口的子视图,并在不再需要时将其关闭。

例如,把这段代码放到你的appdelegate中(假设loginController是你appdelegate的一个属性……还有其他方法,这只是一个例子):

[self.window addSubview:self.loginController.view];

当您想关闭视图时,将其移除:

[self.loginController.view removeFromSuperview];

别忘了正确释放loginController

这样,您的视图只是简单地“叠加”在您的标签栏视图之上。这里还有其他答案,如果您想要的话,只有在您完成登录后才有效地将标签栏视图交换到您的视图层次结构中。

【讨论】:

  • 独立的 UIViewControllers 不建议 addSubView 用于视图吗?
猜你喜欢
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 2017-04-23
  • 2020-06-02
相关资源
最近更新 更多