Скриване на всички контролери за модален изглед

имам изглед за влизане, представен като ModelViewController и имам изглед на регистър, представен като NavigationControlloer върху него:

Влизане (ModelViewController) ---->Регистриране (NavigationController)

представям изгледа за регистриране (CreateAccount) в изгледа за влизане, както следва:

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;
createAccount.title=@"Create Account";

[self presentModalViewController:navController animated:YES];

контролерът за влизане има NSURLConnectionDelegate за кабината за влизане и регистъра. когато регистрацията приключи, просто се обаждам на

[self dismissModalViewControllerAnimated:YES];

което ще отхвърли само изгледа за регистрация.

искам също да отхвърля изгледа за влизане, за да мога да се върна към основното си приложение.


person Kassem    schedule 29.12.2011    source източник
comment
Моля, изяснете как представяте регистрационния изглед. Друг модален изглед ли е?   -  person Mark Adams    schedule 29.12.2011


Отговори (7)


Вижте отговора ми на подобен въпрос тук: Отхвърляне на ModalViewController на ModalViewController

Използвам почти същото нещо като вас в моето приложение и това решение работи за мен. Моля, не забравяйте да прочетете и коментарите, тъй като една от справките се промени с iOS5.

Редактиране: За да отхвърлите модален изглед, който е представен върху друг модален изглед, трябва да извикате dismissModalViewControllerAnimated: на родителя на родителя.

iOS ‹5.0

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

iOS 5.0+ (трябва да промени всички препратки към parentViewController на presentingViewController)

[[[self presentingViewController] presentingViewController] dismissModalViewControllerAnimated:YES];
person superjessi    schedule 29.12.2011
comment
+1 Това работи прекрасно за мен. Би било хубаво, ако решението беше включено и тук. - person Jason George; 07.04.2012
comment
Бъдете внимателни: dismissModalViewControllerAnimated оттеглено (в iOS 6.0), вместо това използвайте dismissViewControllerAnimated:completion:. - person CFIFok; 12.11.2015

Извикването на dismissModalViewController, ако текущият контролер за изглед не е представил никакви модални контролери, вместо това ще извика метода на неговия родител. Извикването на метода на контролер за изглед ще отхвърли всички представени модални контролери за изглед към този контролер. За да илюстрирам:

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

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

  2. Във vc1 представяте модален vc2, след това от vc2 представяте модален vc3. Извикването на dismiss във vc3 ще изпрати съобщението до неговия родител (vc2), което ще отхвърли vc3. За да отхвърлите vc2 и vc3 едновременно, трябва да извикате dismiss във vc1, това ще отхвърли всички (и двата) контролера за модален изглед. Ако отхвърлянето е анимирано, само първият ще бъде анимиран.

Един от най-добрите начини за решаване на това е използването на навигационен контролер през цялото време. т.е. вместо да използвате modalViews първоначално за представяне на изглед за влизане, използвайте navigationViewcontroller там. Ако трябва да представите страница за регистрация. Натиснете този изглед. Ако трябва да отидете до първоначалния изглед (т.е. освен loginView или registrationView), използвайте метода popToRootViewControllerAnimated в navigationViewcontroller.

person Srikar Appalaraju    schedule 29.12.2011

Основният проблем е, че контролерът на изгледа за влизане изобщо не знае кога изгледът за регистрация е отхвърлен и можем да се справим с това с делегиране.

Първо декларирайте протокол и свойство на делегат на контролера на регистрационен изглед.

@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];

Сега, след като казах всичко това. Мога ли да предложа промяна на вашия дизайн? Бих представил контролера за изглед на влизане като част от навигационен контролер от самото начало. След това, ако потребителят избере да се регистрира, просто натиснете регистрационния изглед към контролера. По този начин, независимо откъде отхвърляте, ще трябва да отхвърлите само основния навигационен контролер.

person Mark Adams    schedule 29.12.2011

dismissModalViewControllerAnimated: отхвърля всички контролери за модален изглед, представени върху подателя. За да се върнете обратно към контролера за изглед, който представи контролера за влизане, запазете препратка към него и го отхвърлете, както следва:

[loginController dismissModalViewController:animated]

Това е начинът на груба сила да го направите. В моето приложение, където направих нещо подобно, публикувам различни известия, съответстващи на състоянието на сесия (напр. влизане) и моят контролер за влизане наблюдава тези известия и се отхвърля по подходящ начин.

person XJones    schedule 29.12.2011

Поставете този метод в делегата на вашето приложение и той ще премахне всички контролери за изглед, които имат представен ViewController, което означава, че са били представени модално

-(void)dismissModalViews
{
    if (self.window.rootViewController.presentedViewController) {
        [self.window.rootViewController.presentedViewController dismissViewControllerAnimated:NO completion:nil];
        [self performSelector:@selector(dismissModalViews) withObject:nil afterDelay:0.5];
    }
}
person zurbergram    schedule 01.07.2013
comment
тогава имате друг проблем, току-що тестван в xcode с цел за разработка, зададена на 7.0, и все още работи. Уверете се, че извиквате този метод в NSObject, който имплементира протокола UIApplicationDelegate и че сте задали self.window.rootViewController. Не използвам сториборд за проект - person zurbergram; 14.10.2013
comment
Промених закъснението на 0,75, след което проработи. Компилирах приложение за iOS 6 за iOS 7. Може би са променили времената, защото преди това работеше с 0,5 времена. - person Obiwahn; 14.10.2013

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

Отхвърлете всички контролери с изключение на RootViewController..

person Dimple Shah    schedule 31.05.2017

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

Работи за отхвърляне на всички в iOS 7

person JorMan    schedule 01.04.2014