Добавление экрана входа в систему перед приложением Cocoa Touch Tab Bar для IOS - PullRequest
13 голосов
/ 10 декабря 2010

Все еще разбираюсь здесь. Я даже не близко, но в любом случае .... У меня есть приложение TabBar, созданное из Xcode. Это работает, у меня есть три вида вкладок, которыми я умею манипулировать и т. Д.

Я бы хотел поставить перед собой весь файл пера 'login', требующий от пользователя ответа (пока жестко заданного) имени пользователя и пароля. Если вы понимаете это правильно, то визуализируйте часть вкладки, позволяя им щелкать вокруг.

У меня есть другое приложение, которое я написал, которое выполняет часть имени пользователя и пароля, у меня возникают проблемы с отбором логики и размещением ее перед элементом TabApplication.

У кого-нибудь есть предложения?

Ответы [ 4 ]

17 голосов
/ 10 декабря 2010

В вашем 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];

, который позволяет вам показать его снова, если у вас есть функция выхода из системы.

16 голосов
/ 10 декабря 2010

Стандартный способ следующий:

  • Упакуйте все, что связано с экраном входа в систему, в подкласс 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];
2 голосов
/ 10 декабря 2010

Если вы запускаете приложение панели вкладок по умолчанию, вы можете сделать это следующим образом:

  • В файле MainWindow.xib создайте UIView, который содержит все, что вы хотите иметь в своем пароле.screen
  • Подключите все, что вам нужно, к IBOutlets в AppDelegate и напишите метод, который проверяет, действителен ли пароль.
  • В методе applicationDidFinishLaunching замените [window addSubview:tabBarController.view]; на [window addSubview:/*whatever you called the view with the password stuff in it*/];
  • Если пользователь вводит правильный пароль, сделайте следующее:

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

И вы должны быть в обычном приложении панели вкладок.

0 голосов
/ 06 апреля 2013

Я предпочитаю делать следующее:

В приложении делегата 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;

Затем, после получения обратного вызова аутентификации, вы можете получить что-то подобное в вашем делегате приложения:

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