iPhone - Покрийте модален изглед с друг модален изглед

Имам основен изглед.
От този основен изглед показвам модален изглед (MV1).
MV1 може да показва друг модален изглед (MV2).
От MV2 може да покажа друг модален изглед (MV3) .

Всички тези MV се показват анимирани.

Това, което искам, е да мога първо да покажа (анимиран) следващия модален изглед (MVx+1), преди да „убия“ предишния (MVx).

Ако отхвърля (анимиран) MVx преди да покажа MVx+1 : MVx+1 не се появява.
Ако отхвърля (неанимиран) MVx преди да покажа MVx+1 : MVx-1 се вижда.
Ако покажа MVx+1 преди отхвърляне (не анимиран) MVx : MVx+1 не се появява.

Как мога да направя?

Някои примерни кодове биха ви помогнали, ако имате време, но само подробно обяснение би било достатъчно.


person Oliver    schedule 22.10.2011    source източник
comment
Абсолютно необходимо е да убиете MVx, когато показвате MVx+1?   -  person Sean    schedule 24.10.2011
comment
@Sean : Не, но не искам MVx+1 да трябва да се справя с някакъв предишен показан изглед. Когато убивам MV3, искам да се върна към MV1 (каквото и да е MV1 и каквито и изгледи да са били показани между MV1 и MV3).   -  person Oliver    schedule 24.10.2011


Отговори (1)


Според документите на 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
comment
Ако разбрах, можете да отворите модален изглед от друг модален изглед, нали? - person VansFannel; 05.02.2013