Лучшая практика показа экрана единовременного входа в систему с раскадровками - PullRequest
9 голосов
/ 30 декабря 2011

Я видел подобные вопросы здесь, но не с четким ответом.Поэтому у меня есть один модальный вид входа в систему с классической формой имени пользователя / пароля, кнопкой входа в Facebook и кнопкой регистрации, которую я хотел бы показать, когда пользователь запускает приложение в первый раз.Из того, что я обнаружил, есть два способа реализовать это с короткими замыканиями.

  1. в didFinishLaunchingWithOptions AppDelegate, условное условие установлено, чтобы проверить, вошел ли пользователь в систему. Если не rootViewController установлен в loginViewController.После успешного входа в систему происходит переход к основному виду приложения.Моя проблема с этим подходом состоит в том, что я не уверен, как сбросить rootViewController к основному представлению.Это возможно и как?

Есть ли другие способы показать модальное имя входа без установки rootViewController?Это означает, что я бы оставил свой rVC на главном виде.

  1. в контроллере основного вида в viewDidAppear проверяет условия, если пользователь вошел в систему. Если не выполняется переход к loginVC,Когда пользователь успешно входит в систему, он возвращается к основному представлению, которое отклоняет модальное представление входа в систему.Проблема с этим подходом заключается в том, что кратко показан основной вид, который я бы предпочел не делать.

  2. Есть еще идеи?Пожалуйста, дайте мне знать, что является лучшей практикой, когда дело доходит до этого сценария.Заранее спасибо,

Ответы [ 3 ]

3 голосов
/ 02 сентября 2012

Попробовав много разных способов, я смог решить эту проблему следующим образом:

-(void)viewWillAppear:(BOOL)animated {

    // Check if user is already logged in
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    if ([[prefs objectForKey:@"log"] intValue] == 1) {
        self.view.hidden = YES;
    }
}

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];

    // Check if user is already logged in
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    if ([[prefs objectForKey:@"log"] intValue] == 1) {
        [self performSegueWithIdentifier:@"homeSeg3" sender:self];
    }
}

-(void)viewDidUnload {
    self.view.hidden = NO;
}
3 голосов
/ 25 сентября 2014

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

После некоторого эксперимента вчера, я думаю,лучший способ сделать это с помощью дочерних контроллеров представления:

1.Выберите раскадровку основного интерфейса в XCode, как обычно (нет необходимости добавлять что-либо к вашему appDelegate

main interface

2. Добавьтеследуя вашему контроллеру основного вида в viewDidLoad:

// If user is not logged in, show login view controller
if (!isLoggedIn) {
    // Instantiate Login View Controller from storyboard
    UIStoryboard *mainSB = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    UIViewController *loginVC = [mainSB instantiateViewControllerWithIdentifier:@"Login"];

    // Set the Login View Controller's frame
    loginVC.view.frame = self.view.bounds;

    // Add login screen as a subview and as a child view controller
    [self.view addSubview:loginVC.view];
    [self addChildViewController:loginVC];
    [loginVC didMoveToParentViewController:self];

    // Maintain a reference to the Login screen so we can dismiss it later
    _loginVC = loginVC;
}

3. После того, как пользователь войдет в систему, сообщите своему контроллеру основного вида, используя уведомления или делегата.Вы можете анимировать экран входа любым удобным для вас способом. Здесь я использую анимацию растворения:

// Animate out the category chooser
[UIView animateWithDuration:0.2 animations:^{
    // Dissolve the login screen away
    [_loginVC.view setAlpha:0];
} completion:^(BOOL finished) {
    // Remove login screen as a child view controller
    [_loginVC willMoveToParentViewController:nil];
    [_loginVC.view removeFromSuperview];
    [_loginVC removeFromParentViewController];

    // nil out property
    _loginVC = nil;
}];

И это все! Таким образом, контроллер основного вида всегда является корневым представлением вашего окна.В контроллере экран входа в систему освобождается после входа пользователя в систему, и при первом отображении экрана входа мерцание отсутствует.

1 голос
/ 30 декабря 2011

Вы можете установить rootViewController через AppDelegate, просто настроив контроллер навигации, и, когда вы делаете проверку, установите корневое представление контроллеров навигации на любое представление, которое вы хотите отобразить в это время. Я думаю, что-то вроде этого должно работать, если вы добавите оператор if для того, что вы хотите сделать:

// Override point for customization after application launch.
    RootViewController *rootController = [[RootViewController alloc] initWithNibName:nil bundle:nil];

    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootController];

    self.window.rootViewController = navigationController;
...