2012-07-01 3 views
2

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

Раскадровка имеет вид входа в систему как начальный. Когда логин в порядке, он выполняет segue на TabViewController.

При любом вызове API я проверяю, возвращает ли сервер 401 (не авторизованный). Если это произойдет, логическое значение будет установлено в false (boolean isLogged). AppDelegate наблюдает за этим булевым. Если значение изменено на false, я хочу вернуть пользователя на экран входа в систему (помните, начальный вид на Storyboard).

Вот код:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 

if ([keyPath isEqualToString:@"isLogged"]) { 
    BOOL logged = [[change objectForKey:NSKeyValueChangeNewKey] boolValue]; 
    if (logged) { 
     NSLog(@"Logged in succesfully!"); 
    } else { 
     NSLog(@"Logout performed"); 

     [self.window makeKeyAndVisible]; 
     [self.window layoutSubviews]; 

    } 

} 

Это работает отлично, но когда я пытаюсь войти еще раз LoginOK SEGUE не выполняется.

Я пробовал много других вариантов, что-то вроде этого:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 

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

[source presentModalViewController:loginController animated:YES]; 

Но проблема в том, что я не знаю, какой View Controller выполнил выход из системы. Источник должен быть текущим View Controller, показанным в приложении, не так ли?

ответ

3

Наконец я решил проблему меняющегося наблюдателя для isLogged из App делегата на мой обычай TabViewController. В viewDidLoad Я подписываюсь на этот var.

В методе observeValueForKeyPath я сделать следующее:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 

LoginViewController *loginController = [storyboard instantiateViewControllerWithIdentifier:@"Login"]; 


[self presentModalViewController:loginController animated:YES]; 
+0

Как вы отклонили свой логин? Я получаю 'Предупреждение: попытка отклонить из контроллера представления , пока выполняется презентация или увольнение!' Error :( – expert

+0

Теперь я заменяю rootViewController с помощью loginViewController. Итак: self.view.window. rootViewController = [self.view.window.rootViewController.storyboard instantiateViewControllerWithIdentifier: @ "LoginView"]; –

2

Я думал, что разделю эту довольно случайную идею с вами.

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

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

Просто идея.

Update # 1:

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

Вы можете использовать этот код borrowed from here, чтобы проверить, если экземпляр вид контроллер виден:

if (viewController.isViewLoaded && viewController.view.window) { 
    // viewController is visible 
} 
+0

Да, может быть, вы правы, но это на самом деле не отвечает на мой вопрос. Как я могу узнать из AppDelegate, какое представление показано на вызов метода presentModalViewController? Возможно, это еще один способ сделать то, что я хочу. –

+0

Я нашел аналогичный подход здесь: http://stackoverflow.com/questions/7913840/login-screen-with-storyboarding-possible, но я не могу понять, что является источником в этом коде. –

+0

Я сделал обновление (№ 1), чтобы ответить на ваш вопрос в комментарии выше. – svena

Смежные вопросы