【问题标题】:iOS Tab Bar controller: I need to show different view controllers for unauthorized useriOS标签栏控制器:我需要为未经授权的用户显示不同的视图控制器
【发布时间】:2014-01-23 04:33:39
【问题描述】:

我有带有 3 个标签的标签栏控制器:搜索、消息、我的页面

授权用户可以在所有 3 个选项卡中看到一些信息。

但是对于未经授权的用户 - 当他点击 messages我的页面 - 我想显示这个:

请登录或注册【按钮登录】【按钮注册】

我不想将其显示为模态,我想将标签栏保持在底部。点击[button sign-in]然后显示模式登录屏幕。

那么什么是正确的方法呢?我是否需要以某种方式创建可重用的视图控制器?如果是这样,我如何在标签栏控制器中为许多标签显示它,然后在登录后切换回普通视图控制器?

【问题讨论】:

  • 当使用点击消息时,您可以根据该节目信息检查其是否授权。
  • 是的,但主要问题是如何
  • 创建UIView 的子类,其中包含您要显示的信息,然后如果用户未授权,则将其添加到视图中
  • - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{ 将此委托用于UITabbarController
  • @Jugale 我考虑过这一点,但如果我想使用自动布局功能不是太复杂 - 我需要以编程方式为所有元素(标签、按钮、图像)设置约束。

标签: ios uitabbarcontroller


【解决方案1】:

您可以让“我的页面”的视图控制器是一个空视图,检查 ViewWillLoad 上的登录状态(在“我的页面 VC”中)然后,根据 AUTHORIZED/UNAUTHORIZED,您可以将两个 XIB 之一加载到风险投资。

或者,您可以根据登录状态动态修改标签栏。加载时,“立即登录”选项卡将被删除,并且可以添加“我的页面”选项卡。看看我写的类似的东西:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

if([prefs boolForKey:@"is_logged_in"]) {
    NSMutableArray * vcs = [NSMutableArray
                     arrayWithArray:self.viewControllers];
    [vcs removeObjectAtIndex:2];
    LoginVC * myPage = [[LoginVC alloc] init];
    [vcs addObject:myPage];
    [self setViewControllers:vcs animated:YES];
}

注意:要使用上述代码,您需要将 UITabBarController 设为自定义类并将其添加到 ViewDidLoad

【讨论】:

  • 很好的提示,谢谢!一个问题:我正在使用 Storyboards(没有 XIB)——那么如何将这一行转换为 Storyboards? LoginVC * myPage = [[LoginVC alloc] init];?因为它不能正常工作 - 项目被添加到标签栏但是当我点击它时 - 它显示黑屏。
  • 在这里找到它stackoverflow.com/questions/16134361/…。现在工作正常,非常感谢您的回答!
【解决方案2】:

使用 UITabBarControllerDelegate 方法

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{
  return NO;// if unauthorized
}

  - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
}

【讨论】:

  • +1 感谢您提供我不知道的新信息,但这不是我真正需要的,因为我确实想要选择一个标签 - 但更改标签的内容以获取未经授权用户。
【解决方案3】:

对你来说有很多方法。一旦如此简单是这样的:

  • 为您的 keyWindow 添加一个视图并将其隐藏。此视图也应包含您的所有消息和按钮。在 AppDelegate 中执行此操作。

中提供此代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    UIView *view = [[UIView alloc]initWithFrame:self.window.frame];
    [view setBackgroundColor:[UIColor colorWithWhite:0.2 alpha:0.7]];

    UIButton * loginButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [loginButton setTitle:@"Sign In" forState:UIControlStateNormal];
    [loginButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    [loginButton setBackgroundImage:GETIMAGE(@"loginNormal", @"png") forState:UIControlStateNormal];
    [loginButton setBackgroundImage:GETIMAGE(@"loginPressed", @"png") forState:UIControlStateHighlighted];
    [loginButton setFrame:CGRectMake(100, 300, 100, 40)];
    [loginButton addTarget:self action:@selector(LoginMe:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:loginButton];

    UIButton * cancelButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [cancelButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [cancelButton setTitle:@"Cancel" forState:UIControlStateNormal];
    [cancelButton setBackgroundImage:GETIMAGE(@"loginNormal", @"png") forState:UIControlStateNormal];
    [cancelButton setBackgroundImage:GETIMAGE(@"loginPressed", @"png") forState:UIControlStateHighlighted];
    [cancelButton setFrame:CGRectMake(100, 350, 100, 40)];
    [cancelButton addTarget:self action:@selector(DismissMe:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:cancelButton];
    [[[UIApplication sharedApplication] keyWindow] addSubview:view];
    view.center = [[UIApplication sharedApplication] keyWindow].center;

    [view setTag:666666];
    [view setAlpha:0.0];
  • 实现您的方法DismissMeLoginMe
  • 现在点击你所说的某些东西*当他点击消息或我的页面时*

如果用户未经授权,请添加此代码。

[[[UIApplication sharedApplication] keyWindow] bringSubviewToFront:[[[UIApplication sharedApplication] keyWindow] viewWithTag:666666]];
[[[[UIApplication sharedApplication] keyWindow] viewWithTag:666666] setAlpha:1.0];
  • 现在在 LoginMe 实现中,您可以执行类似 Modal 的操作。

    UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;
    if([self.window.rootViewController isKindOfClass:[UITabBarController class]]) {
        self.loginController = [[MyLoginViewController alloc]init];
        [topController presentViewController:self.loginController animated:YES completion:nil];
    }
    

这里是一些截图: - 我的主屏幕

  • 如果未经授权,请取消登录。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多