Возможен ли экран входа в систему с раскадровкой? - PullRequest
18 голосов
/ 27 октября 2011

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

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

Вот как я это сделаю.Я создаю Viewcontroller, который выполняет соединение в методе viewDidLoad.Если данные для входа отсутствуют или вход не был успешным, мне нужно вручную перейти к экрану входа в систему.

Теперь это вообще возможно, или мне для этого нужны 2 раскадровки?

Ответы [ 4 ]

20 голосов
/ 10 апреля 2012

Я решил это, поместив вид входа в систему без каких-либо переходов (туда-сюда), как на скриншоте ниже:

enter image description here

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

В классе контроллера панели вкладок я использую viewDidLoad, чтобы запустить представление входа в систему. Чтобы показать модальное представление, у меня есть одноэлементная вещь, которая хранит некоторое состояние, скажем, BOOL isAuthenticated, где я делаю магию:

- (void) performLoginIfRequired: (UIViewController *) source {

   if (!self.isAuthenticated) {

       NSLog(@"Is not authed");

       UIStoryboard *storyboard = [UIApplication sharedApplication].delegate.window.rootViewController.storyboard;

       UIViewController *loginController = [storyboard instantiateViewControllerWithIdentifier:@"loginScreen"];

       [source presentModalViewController:loginController animated:YES];

   } else {
       NSLog(@"Is authe");

   }
}

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

-(void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self  selector:@selector(willEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
}

В методе willEnterForeground я делаю:

-(void) willEnterForeground: (NSNotification *)notification {
    [[myStateThingy defaultState] performLoginIfRequired:self]; 
}
8 голосов
/ 27 октября 2011

Похоже, вам нужно использовать метод executeSegueWithIdentifier .Убедитесь, что оба представления находятся в одной раскадровке, свяжите их вместе, используя толчок, и дайте этому имени имя.Затем из кода вашего первого вида контроллера просто вызовите executeSegueWithIdentifier , чтобы выполнить ручной переход.

Надеюсь, это поможет!

См. Также: Условно после перехода

Приветствия, Джесси Л. Самора

3 голосов
/ 09 апреля 2013

У меня была такая же проблема, и я решил ее, просто выполнив следующее: Вместо того, чтобы пытаться перейти от к экрану входа (модально или push), я сделал экран входа в систему своим корневым контроллером представления. В методе viewWillAppear контроллера вида входа в систему я проверяю, вошел ли кто-то уже в систему. Если это так, я нажимаю мой домашний экран:

// mutableFetchResults is an array with my persistent Credentials object
if ([mutableFetchResults count] > 0) { // Someone's already logged in
  [self performSegueWithIdentifier:@"Home" sender:self];
}

Кроме того, в методе viewWillAppear контроллера начального экрана я скрыл кнопку «Назад» с этой строкой, чтобы пользователь не мог вернуться «назад» к экрану входа в систему:

self.navigationItem.hidesBackButton = YES;

Наконец, на каждой странице моего приложения есть кнопка «Выход» в правом верхнем углу. Выйти из системы и открыть экран входа в систему было так просто:

- (IBAction)signOutButtonPressed:(UIBarButtonItem *)sender {
  MyAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
  [appDelegate signOutCurrentUser]; // this method in my app delegate deletes the current Credentials
  [self.navigationController popToRootViewControllerAnimated:YES];
}

Надеюсь, это было достаточно просто!

0 голосов
/ 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...