2011-12-29 2 views
9

Я вид входа в систему, представленную как ModelViewController и у меня есть вид регистра, представленный как NavigationControlloer на нем:Скрыть все модальные контроллеры просмотра

Войти (ModelViewController) ----> Регистрация (NavigationController)

я представляю мнение регистра (Createaccount) в LoginView следующим образом:

createAccount= [[CreateAccount alloc] initWithNibName:@"CreateAccount" bundle:nil]; 

navController = [[UINavigationController alloc] initWithRootViewController:createAccount]; 

UIBarButtonItem *cancelButtun=[[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(HideMe)]; 

UIBarButtonItem *registerButtun=[[UIBarButtonItem alloc]initWithTitle:@"Register" style:UIBarButtonItemStyleBordered target:self action:@selector(Register)]; 

createAccount.navigationItem.leftBarButtonItem = cancelButtun; 
createAccount.navigationItem.rightBarButtonItem=registerButtun; 
[email protected]"Create Account"; 

[self presentModalViewController:navController animated:YES]; 

контроллер Войти имеет NSURLConnectionDelegate для стенда логин и регистр. при регистрации finishs я просто позвонить

[self dismissModalViewControllerAnimated:YES]; 

который будет увольнять только вид регистрации.

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

+0

Просьба уточнить, как вы представляете вид регистрации. Это еще один модный взгляд? –

+0

Я отредактировал сообщение :) – Kassem

ответ

19

Проверьте мой ответ на аналогичный вопрос здесь: Dismissing ModalViewController of ModalViewController

Я использую почти то же самое, что и вы в моем приложении, и это решение работает для меня. Обязательно прочтите комментарии, так как одна из ссылок изменилась с iOS5.

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

IOS < 5,0

[[[self parentViewController] parentViewController] dismissModalViewControllerAnimated:YES]; 

IOS 5.0+ (необходимо изменить все ссылки на parentViewController на presentingViewController)

[[[self presentingViewController] presentingViewController] dismissModalViewControllerAnimated:YES]; 
+1

+1 Это прекрасно работало для меня. Было бы неплохо, если бы решение было включено и здесь. –

+1

@JasonGeorge отредактирован, чтобы включить ответ ... спасибо :) – superjessi

+2

Будьте осторожны: _dismissModalViewControllerAnimated_ ** устарел ** (в iOS 6.0), используйте _dismissViewControllerAnimated: завершение: _ вместо. – CFIFok

23

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

Если у вас есть три контроллера вида: vc1, vc2 и vc3, а vc1 является основным/в настоящее время используемым контроллером представления.

  1. В vc1 вы представляете модальный vc2. В vc2 вы вызываете увольнение, потому что нет модальных vcs, представленных из vc2, сообщение об увольнении передается родительскому (vc1), который отклоняет vc2, и вы вернулись в vc1.

  2. В vc1 вы представляете модальный vc2, а затем vc2, представленный modal vc3. Вызов отклонения в vc3 отправит сообщение его родительскому лицу (vc2), которое отклонит vc3. Чтобы одновременно отклонить vc2 и vc3, вам нужно вызвать функцию увольнения в vc1, это отклонит все (оба) модальные контроллеры. Если вы отпустите анимацию, будет только анимирован только первый.

Одним из лучших способов решения этой проблемы является использование сквозного контроллера навигации. то есть вместо того, чтобы сначала использовать modalViews для представления входа в систему, используйте navigationViewcontroller там. Если вам нужно представить страницу регистрации. Нажмите этот вид. Если вам нужно перейти к исходному виду (то есть, кроме loginView или registrationView), используйте метод popToRootViewControllerAnimated в navigationViewcontroller.

+3

+1 Очень полезно понять поток vc. –

0

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

[loginController dismissModalViewController:animated] 

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

1

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

Сначала объявите протокол и свойство делегата на контроллере просмотра регистрации.

@protocol CreateAccountDelegate; 

@interface CreateAccount : UIViewController 

@property (nonatomic, assign) id <CreateAccountDelegate> delegate; 

@end 

@protocol CreateAccountDelegate <NSObject> 

- (void)createAccountViewControllerDidFinish:(CreateAccount *)controller; 

@end 

Затем необходимо сделать контроллер входа в систему делегатом контроллера регистрации.

createAccount = [[CreateAccount alloc] initWithNibName:@"CreateAccount" bundle:nil]; 
createAccount.delegate = self; 

И реализовать -createAccountViewControllerDidFinish:

- (void)createAccountViewControllerDidFinish:(CreateAccount *)controller 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

Наконец, когда вы закроете внутри контроллера регистрации, сообщение делегата информировать его, если ваше неизбежное увольнение.

[self.delegate createAccountViewControllerDidFinish:self]; 
[self dismissModalViewControllerAnimated:YES]; 

Теперь, сказав все это. Могу ли я предложить изменение дизайна? Я бы представил контроллер входа в систему как часть контроллера навигации с самого начала. Затем, если пользователь захочет зарегистрироваться, просто нажмите регистрационное представление на контроллер. Таким образом, независимо от того, куда вы уволяете, он должен будет отклонить основной контроллер навигации.

0

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

-(void)dismissModalViews 
{ 
    if (self.window.rootViewController.presentedViewController) { 
     [self.window.rootViewController.presentedViewController dismissViewControllerAnimated:NO completion:nil]; 
     [self performSelector:@selector(dismissModalViews) withObject:nil afterDelay:0.5]; 
    } 
} 
+0

перестали работать для меня в iOS 7 – obiwahn

+0

, тогда у вас есть другая проблема, просто протестированная в xcode с целью разработки, установленной в 7.0, и она все еще работает. Убедитесь, что вы вызываете этот метод в NSObject, который реализует протокол UIApplicationDelegate и что вы установили self.window.rootViewController.Я не использую раскадровку по проекту – zurbergram

+0

Я изменил задержку на 0,75, тогда она сработала. Я скомпилировал приложение iOS 6 для iOS 7. Возможно, они изменили тайминги, потому что до этого он работал с таймером 0,5. – obiwahn

-2
while(self.presentedViewController) 
     [self.presentedViewController dismissViewControllerAnimated:NO completion:nil]; 

Работали уволить все прошивкой 7

0
[[[[UIApplication sharedApplication] keyWindow] rootViewController] dismissViewControllerAnimated:true completion:nil]; 

Отклонить все контроллеры кроме RootViewController ..

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

  • Нет связанных вопросов^_^