iPhone - накрыть модальный вид другим модальным видом - PullRequest
0 голосов
/ 22 октября 2011

У меня есть главный вид.
С этого основного вида я показываю модальный вид (MV1).
MV1 может отображать другой модальный вид (MV2).
Из MV2 я могу показать другой модальный вид (MV3).

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

То, что я хочу, - это иметь возможность сначала отобразить (анимированный) следующий модальный вид (MVx + 1), прежде чем "убить" предыдущий (MVx).

Если я отклоняю (анимированный) MVx перед показом MVx + 1: MVx + 1 не появляется.
Если я отклоняю (не анимированный) MVx перед показом MVx + 1: MVx-1 виден.
Если я показываю MVx + 1 перед удалением (без анимации) MVx: MVx + 1 не появляется.

Как мне это сделать?

Некоторый пример кода поможет, если у вас есть время, но достаточно подробного объяснения.

1 Ответ

1 голос
/ 25 октября 2011

Согласно документации 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];
}
...