2012-02-17 3 views
1

Вот моя ситуация.Правильный способ присвоить делегата

У меня есть ViewControllerA и он способен загрузить ViewControllerB через настоящее времяModalViewController. Теперь ViewControllerB может позже нажать на ViewControllerC. Оба ViewControllerB и ViewControllerC - это тот же класс. Как назначить ViewControllerA в качестве делегата, когда я нажимаю ViewControllerC?

В настоящее время я назначаю ViewControllerB делегату ViewControllerC, который затем вызывает ViewControllerA, и я чувствую, что это не так. Цепь управления: ViewControllerC ->ViewControllerB ->ViewControllerA

Спасибо.

+0

Почему вы не чувствуете, что это правильно? Любой объект должен «знать» столько же о других объектах, сколько ему нужно. –

ответ

1

Я чувствую, что дизайн немного неуклюжий. Вместо того, чтобы передавать делегату обратно цепочку, почему бы просто не назначить делегата как ViewControllerB, так и ViewControllerC для viewControllerA (поскольку они являются одним и тем же классом). Вы не должны пропустить цепь, если C не должен общаться с Б.

Перед тем как представить ViewControllerB:

b.delegate = self 
[self presentModalViewController:b animated:YES]; 

в ViewControllerB до нажатия ViewControllerC

c.delegate = self.delgate 
[self.navigationController pushViewController:c animated:YES] 

таким образом как B-> A, а также C-> A

0

Ваш дизайн (C-> B-> A) не так уж плох, поскольку он следует логике потока пользовательского интерфейса. (Вы не прыгаете напрямую с C на A.) Тем не менее, вы можете назначить A в качестве делегата, если хотите. Просто убедитесь, что A остается в памяти (с контроллерами модального просмотра, которые должны быть автоматическими).

+0

, даже если он выгружен, вызывается только представление viewcontroller, а не сам viewcontroller - переменные сохраняют свои значения –

+0

@rokjarc, конечно, но если A get разгружен и C или B хочет поместить обратный вызов к чему-то, что не существует это неизбежно сбой. У меня это произошло, например. с асинхронным запросом. – Mundi

+0

@ Манси: да, ты прав. во всяком случае: только разумно убедиться, что что-то действительно существует, прежде чем отправлять ему сообщение, если даже небольшая вероятность того, что адрес может быть нанесен. –

Смежные вопросы