Според документите на Apple, приетият начин за отхвърляне на модални изгледи е като се позволи на родителския контролер (т.е. контролерът на изглед, който е създал модалния изглед) да направи отхвърлянето. Най-добрият начин да направите това е като зададете родителския контролер като делегат на контролера за модален изглед. Идеята тук е, че модалният контролер казва на своя родител, че е готов да бъде отхвърлен, а родителят решава какъв курс на действие да предприеме оттам нататък.
За да направите това, трябва да създадете протокол за делегат за контролера за модален изглед, който родителският контролер изпълнява. Във вашия случай можете да създадете протокол в горната част на всеки от вашите .h файлове за вашите модални изгледи, за да направите това (или единичен протокол в отделен файл, ако всички модални изгледи могат да използват един и същ метод за отхвърляне). Например:
@protocol MYModalViewDelegate <NSObject>
-(void)dismiss;
@end
След това във всеки от вашите контролери за модален изглед създайте променлива на екземпляр за делегата:
@interface MYModalViewController1 : UIViewController {
id<MYModalViewDelegate> delegate;
}
Когато показвате модален изглед от текущ контролер на изглед, задайте текущия контролер като делегат.
MYModalViewController1 * mvc1 = [[MYModalViewController1 alloc] initWithNibName:@"MYModalViewController1" bundle:nil];
mvc1.delegate = self;
[self presentModalViewController:mvc1 animated:YES];
[mvc1 release];
Когато искате да освободите текущия модален контролер, накарайте контролера за модален изглед да извика подходящия протоколен метод на своя делегат:
[self.delegate dismiss];
Сега делегатът може да реши къде да продължи. Във вашия случай можете да затворите MV2 автоматично, когато MV3 се затвори, като извикате [self.delegate dismiss]
в MV3, след което внедрите dismiss
в MV2 като:
-(void)dismiss {
[self dismissModalViewControllerAnimated:YES];
[self.delegate dismiss];
}
person
Sean
schedule
24.10.2011
MVx
, когато показватеMVx+1
? - person Sean   schedule 24.10.2011