繁体   English   中英

在IOS的Cocoa Touch Tab Bar Application前面添加登录屏幕

[英]Adding login screen in front of Cocoa Touch Tab Bar Application for IOS

仍然在这里绕开我的脑袋。 我什至没有关闭,但是无论如何...。我有一个从Xcode创建的TabBar应用程序。 它的工作原理是我有三个选项卡视图,知道如何操作等。

我想在整个过程前放置一个“ login” nib文件,要求用户回答一个(目前已硬编码)用户名和密码。 如果正确,则渲染选项卡部分,允许他们单击。

我已经编写了另一个应用程序,该应用程序负责用户名和密码部分,我无法从那里获取逻辑并将其放在TabApplication部分的前面。

有人有什么建议吗?

在您的AppDelegate中,在application didFinishLaunchingWithOptions方法末尾,您将看到以下内容:

[window addSubview:tabcontroller.view];
[window makeKeyAndVisible];
return YES;

只需初始化您的登录视图控制器并将其添加到tabcontroller之后,如下所示:

initialScreenViewController = [[InitialScreenViewController alloc] init];
[window addSubview:tabcontroller.view];
[window addSubview:initialScreenViewController.view];
[window makeKeyAndVisible];
return YES;

在登录viewcontroller中,对用户进行身份验证后,可以像这样隐藏它:

[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通信,我将使用NSNotification ,但这对您来说可能有点困难。

一种可能更容易理解(但loginDone我口味)的方法是定义一个方法,例如在应用程序委托中使用loginDone 然后,在LoginViewController ,您可以执行

MyAppDelegate*appDelegate=[[UIApplication sharedApplication] delegate];
[appDelegate loginDone];

如果从默认选项卡栏应用程序开始,则可以这样操作:

  • 在MainWindow.xib中,创建一个UIView,其中包含您希望在密码屏幕上拥有的所有内容
  • 在AppDelegate中将所需的任何内容挂接到IBOutlets,然后编写检查密码是否有效的方法。
  • 在applicationDidFinishLaunching方法中,替换[window addSubview:tabBarController.view]; [window addSubview:/*whatever you called the view with the password stuff in it*/];
  • 如果用户输入正确的密码,请执行以下操作:

[passView removeFromSuperview]; [window addSubview:tabBarController.view];

并且您应该在常规的标签栏应用程序中。

我更喜欢执行以下操作:

在App Delegate的didFinishLaunchingWithOptions

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;

然后,在获得身份验证回调后,您可以在App Delegate中添加以下内容:

- (void)setAuthenticatedState:(BOOL)authenticated
{
    if (authenticated == YES) {
        dispatch_async(dispatch_get_main_queue(), ^(){
            self.window.rootViewController = self.tabBarController;
        });
    }else{
        // Stuff
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM