2010-07-11 2 views
2

View Controller A представляет собой контроллер вида B с мотивом, который имеет кнопку для представления View Controller C modally.Отклоняющиеся контроллеры Modal View

Вот мой поток:

A presents B which presents C 

Когда B представляет C, я хочу, B, чтобы быть распущен, так что мои только просматривать контроллеры А и С. Я не уверен, куда звонить:

[self dismissModalViewControllerAnimated:NO]; 

для того, чтобы уволить Б.

Я создал образец делегации, где сразу после B представляет C, A будет распускать B, однако ничто не уволен.

Если B является делегатом C, тогда C увольняет себя.

ответ

0

Для этого вам необходимо использовать UINavigationController.

* создать контроллер навигации с контроллером B в качестве контроллера корневого представления. * Представьте навигационный контроллер как модальный с presentModalViewControler: анимированный: это будет иметь такое же влияние, как и представление B * Когда B должен представить C, он подталкивает его к стеку диспетчера навигационного представления, вызывая [self.navigationController pushViewController: C анимированный: ДА] * если C необходимо уволить, чтобы оскорбить B, вы можете сделать это, позвонив [self.navigationController popViewControllerAnimated: YES] * Если C необходимо уволить и оскорбить A, вы можете отклонить модальный код, вызвав [self.navigationController .parentViewController rejectModalAnimated: YES]

вы можете пойти дальше на 1 шаг и вообще не использовать модальность, вставив A в качестве контроллера корневого представления контроллера навигации и нажав B на контроллер навигации вместо того, чтобы показывать ting это как модальный

+0

я должен представить и распускать вид модального контроллеры из-за способ моего приложения. Модальные представления - это tabbarcontrollers, которые могут отображаться только модально. –

+0

Мне кажется, что существует проблема с дизайном приложений. Вы боретесь с каркасом, это никогда не является хорошей идеей и приведет к дальнейшим проблемам. Однако я думаю, что может быть решение ... A обычно представляет B. Когда B представляет C, сделайте следующее (предполагая, что self является экземпляром B): [self.parentViewController rejectModalViewControllerAnimated: NO]; [self.parentViewController presentModalViewControler: C animated: YES]; Возможно, вам не нужна первая линия. – Blueneon

0

Я думаю, что вы не можете этого сделать. Прочтите еще раз документацию для dimissing the modal view controller

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

Это означает, что если вы закроете B, вы будете увольнять C, а

+0

Мысль: Можно ли сохранить ссылку на A в B. Тогда, чтобы эта ссылка A, в B, присутствовала C? Затем я могу уволить B и продолжить показ C, так как он не будет уволен B? –

+0

Я пробовал выше, без везения. –

+0

Я думаю, вы не можете этого сделать. Лучший способ сделать это - использовать некоторые трюки: сначала использовать A present B, а затем быстро отпустить B без анимации и представить C. Я не уверен, что это будет работать в вашем случае – vodkhang

0

просто сделать это с

[self.navigationController dismissModalViewControllerAnimated:YES]; 
+0

Отличный совет. Это то, что я сделал, чтобы заставить его работать: C вызывает B, который вызывает A, который предоставляет ваш код. –

+0

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

1

Я думаю, что вы можете использовать NSNotificationCenter. Вы можете сделать NSNotificationCenter в B, который вызывает метод, чтобы отклонить его, а затем сделать сообщение «Уведомление от C», чтобы позвонить в NSNotificationCenter по адресу B.

Я не уверен в этом, но он может работать.

В B добавить:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissFunction:) name:@"DismissFunction" object:nil]; 

и способ, как это:

- (void)dismissFunction:(NSNotification*)notification 
{ 
     [self.navigationController dismissModalViewControllerAnimated:YES]; 
} 

И в C добавить:

[[NSNotificationCenter defaultCenter] postNotificationName:@"DismissFunction" object:nil]; 
Смежные вопросы