2015-11-06 3 views
0

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

Я использую этот метод для моего выхода из системы. (Перешедших из What is the perfect way to make a logout from IOS app?)

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
     if (buttonIndex == 0) { 
      NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; 
      [defaults setObject:nil forKey:@"UserId"]; 
      [defaults synchronize]; 
      //redirect to login view 

      NewClassMoonAppDelegate * appsDelegate =[[UIApplication sharedApplication] delegate]; 
      LoginViewController *second = [[LoginViewController alloc]initWithNibName:nil bundle:nil]; 
      [appsDelegate.window setRootViewController:nil]; 
      [appsDelegate.window setRootViewController:login]; 
    } 
} 

Мой вопрос заключается в том, чтобы закрыть все открытые ViewController перед выполнением выхода из системы? Когда я реализую метод выше, страница, на которой я нажал кнопку выхода из системы, остается открытой в фоновом режиме. Может ли кто-нибудь помочь мне в отношении того же. Заранее спасибо.

+0

Вы должны выполнить «закрытие» всех VC в стеке после выхода из системы. Просто вызовите '[self.navigationController popToRootViewControllerAnimated: YES];'. Это приведет к появлению всех существующих VC в вашем штатном стеке и вернет вас к вашему корню Vc – NSNoob

+0

Контроллер просмотра остается в фоновом режиме? Что ты имеешь в виду. Это все еще видно? – MarkHim

+0

Спасибо @NSNoob .. Bt это приложение не использует навигационный контроллер. Есть ли другой путь..?? – luckyShubhra

ответ

1

Чтобы отклонить все модальные UIViewControllers, вы можете сделать sth. как в этом методе

-(void)dismissModalStack { 
    UIViewController *vc = self.presentingViewController; 
    while (vc.presentingViewController) { 
     vc = vc.presentingViewController; 
    } 
    [vc dismissViewControllerAnimated:YES completion:NULL]; 
} 

(как показано здесь: iPhone - dismiss multiple ViewControllers)

вместо

[self.navigationController popToRootViewControllerAnimated:YES]; 

, так как это только выскочит ваш толкнул UIViewControllers из навигационного стека.

Так что для вас было бы

-(void) actionSheet: (UIActionSheet *) actionSheet clickedButtonAtIndex: (NSInteger) buttonIndex { 
    if (buttonIndex == 0) { 
     NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; 
     [defaults setObject: nil forKey: @"UserId"]; 
     [defaults synchronize]; 

     UIViewController *vc = self.presentingViewController; 
     while (vc.presentingViewController) { 
      vc = vc.presentingViewController; 
     } 
     [vc dismissViewControllerAnimated:YES completion:NULL]; 

     NewClassMoonAppDelegate * appsDelegate = [[UIApplication sharedApplication] delegate]; 
     LoginViewController * second = [[LoginViewController alloc] initWithNibName: nil bundle: nil]; 
     [appsDelegate.window setRootViewController: login]; 
    } 
} 
+0

да .. Это работает. Но теперь проблема в том, что страница LoginViewController остается открытой в фоновом режиме. Должен ли я проверить LoginViewController и не закрывать его в showModal Stack .. ?? – luckyShubhra

+0

Не хотите, чтобы loginViewController был видимым? Какое целевое состояние вы хотите достичь? – MarkHim

+0

Я хочу, чтобы loginViewController был видимым. Bt I m ​​получает 2 loginViewController один на переднем плане, а также один в фоновом режиме. – luckyShubhra

1

Это идеальная работа для NSNotification: когда пользователь вводит кнопку Выхода, вы сгореть пользовательское уведомление, как так:

[[NSNotificationCenter defaultCenter] postNotificationName:@"userWillLogoutNotification" object:nil userInfo:nil]; 

Тогда каждый вид/навигацию/табуляцию/любой контроллер может реагировать соответствующим образом и «перезагружать» себя.

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

+0

M new в этом поле. Могу я узнать, как я могу получить доступ к уведомлению на всех страницах ... ?? – luckyShubhra

+1

Каждый контроллер регистрируется в NSNotificationCenter по умолчанию, который передает уведомление всем своим слушателям. Это общий подход для такого рода событий (один «сигнал», отправленный нескольким потенциально неизвестным слушателям) – Cyrille

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