Добавление экрана входа в систему перед Cocoa Прикладная панель Touch Tab для IOS

По-прежнему все вокруг. Я даже не близко, но в любом случае.... У меня есть приложение TabBar, созданное из Xcode. Он работает, у меня есть три вида вкладок, которые я умею манипулировать и т.д.

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

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

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

Ответы

Ответ 1

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

В вашем контролере входа в систему после аутентификации пользователя вы можете скрыть его следующим образом:

[self.parentViewController.view setHidden:YES];

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

Ответ 2

Стандартный способ:

  • Поместите все, что связано с экраном входа в представление, и подкласс 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];

Ответ 3

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

  • В MainWindow.xib создайте UIView, который содержит все, что вы хотите иметь на экране своего пароля.
  • Прикрепите все, что вам нужно до 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];

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

Ответ 4

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

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