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

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

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

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

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


person John Batdorf    schedule 10.12.2010    source источник


Ответы (4)


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

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

person Matthew Frederick    schedule 10.12.2010
comment
Спасибо, завтра попробую. Обычно я разработчик С#, поэтому синтаксис и идеология того, как все это работает, все еще формируются в моем мягком мозгу. Спасибо. - person John Batdorf; 10.12.2010
comment
Поэтому, когда он загружается, загружается представление вкладки, и я вижу только его нижнюю часть, LoginView все еще находится «сверху». Что я делаю неправильно? - person John Batdorf; 10.12.2010
comment
Пример того, что я вижу. dl.dropbox. com/u/10462461/ вы можете увидеть панель вкладок под представлением пользовательского интерфейса внизу. - person John Batdorf; 10.12.2010
comment
Это до того, как вы отклонили вход в систему с помощью строки setHidden? Если это так, это означает, что ваш вход в систему должен быть выше, примерно на 20 пикселей. Или после того, как вы отклонили вход в систему с помощью строки setHidden? - person Matthew Frederick; 10.12.2010
comment
После! - Я вызываю setHidden:YES и получаю скриншот. Я начал с проекта TabView из xcode. добавил третью вкладку, правильно все подключил (я думаю), а затем добавил LoginViewController и LoginView Nib. Я загружаю nib для входа в систему, как вы сказали, и подключаю все элементы пользовательского интерфейса для LoginView, прямо сейчас пользователь/пароль жестко запрограммирован для проверки учетных данных, и как только я получаю это право, я делаю setHidden, и я все еще вижу loginView, и TabView (частично видно на снимке экрана). Спасибо за помощь. - person John Batdorf; 11.12.2010
comment
Вот что у меня сработало: [self.view removeFromSuperview]; - person John Batdorf; 11.12.2010
comment
Рад, что вы решили эту проблему, хотя я не уверен, почему мое предложение не сработало, поскольку у меня есть пара проектов, в которых используется тот же метод. Тем не менее, хорошие новости. - person Matthew Frederick; 11.12.2010
comment
Как вы работаете со свойством window.rootViewController в новых версиях iOS? - person Stas; 09.01.2013
comment
@Stas К сожалению, мне давно не приходилось этого делать, поэтому я не уверен. - person Matthew Frederick; 09.01.2013

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

  • Упакуйте все, что связано с экраном входа в систему, в представление и подкласс 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];
person Yuji    schedule 10.12.2010
comment
Как удалить его из LoginControllerView? - person John Batdorf; 10.12.2010
comment
Выполните [self.tabController dismissModalViewControllerAnimated:YES] из делегата приложения после завершения входа в систему. Вы можете сделать [self.parentViewController dissmissModalViewControllerAnimcated:YES] из метода LoginViewController, но в любом случае вам нужно сообщить делегату приложения, что вы успешно выполнили вход. Я предпочитаю отклонять его от делегата приложения. - person Yuji; 10.12.2010
comment
Извините, пытаюсь понять ваше объяснение. Итак, в моем LoginViewController, как только они проходят аутентификацию, как мне передать это событие обратно делегату приложения? Спасибо. - person John Batdorf; 10.12.2010
comment
presentModalViewController устарел, используйте вместо него [self.tabController presentViewController:self.loginController animated:YES completion:nil];. В этом случае анимация выглядит некрасиво, потому что tabController должен появиться первым, и только после того, как он появится на экране, он должен представить loginController. Поэтому я предпочитаю пройти animated:NO. - person Stas; 09.01.2013

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

  • В 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];

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

person Jumhyn    schedule 10.12.2010

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

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