Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: John BatdorfОтветов: 4

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

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

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

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

xcodeiosiphoneobjective-ctabbar

Ответы

Ответ 1 · рейтинг 17 · Matthew Frederick

В вашем AppDelegate в конце метода application didFinishLaunchingWithOptions вы увидите следующее:

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

Просто инициализируйте свой контроллер входа в систему и добавьте его после контроллера вкладок, например:

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

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

[self.parentViewController.view setHidden:YES];

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

Ответ 2 · рейтинг 16 · Yuji

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

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

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

  • В 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 · Tony

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы