Могут ли два контроллера представления быть делегатами друг для друга? - PullRequest
3 голосов
/ 30 января 2010

Я изучаю цель-c и касание какао одновременно с созданием приложения, поэтому у меня есть довольно простой вопрос (я думаю), извините, у меня на сайте недостаточно очков, чтобы показать визуальная схема моего сайта.

Но позвольте мне объяснить, у меня есть следующее

  • Main ViewController
  • ViewController A
  • ViewController B
  • ViewController C
  • ViewController 1
  • ViewController 2

Все ViewController A, B и C имеют делегатов протокола, которые используются Main ViewController.
ViewController 1 и 2 имеют делегаты протокола, которые используются ViewController C.

Однако мне также нужно, чтобы ViewController C был делегатом для Main ViewController.

Из-за этого я недавно создал делегат протокола в Main ViewController, однако при попытке назначить ViewController C в качестве делегата я получаю ошибки, особенно при попытке импортировать заголовочный файл Main ViewController в View Controller C I ' получаю сообщение об ошибке компиляции по следующим причинам

  • Главный заголовочный файл ViewControllers может больше не найти протокол для ViewController C
  • Ожидаемый спецификатор-квалификатор-список до 'ViewController C'

Возможно ли то, что я пытаюсь достичь? Могут ли два контролера просматривать делегаты bd друг для друга? А если нет, то какой будет идеальный способ выполнить то, что я делаю?

Внутри ViewController CI попробовал альтернативу, имея метод для вызова Main ViewController, создав указатель родительского контроллера представления, создав экземпляр ViewController B (именно поэтому я хочу, чтобы делегат работал), а затем добавив представление ViewControler B новый указатель, который я создал, он компилируется, но не работает (я постараюсь выяснить, почему, это не то, что я здесь спрашиваю).

Большое спасибо, я очень ценю этот сайт некоторое время.

Ответы [ 3 ]

1 голос
/ 30 января 2010

Обратите внимание, что их можно описать (как в St3fan), но именно поэтому делегаты всегда должны назначаться без сохранения ссылок, потому что в противном случае каждый из них не допустит освобождения другого.

1 голос
/ 30 января 2010

Это пахнет как плохой дизайн приложения. Но чтобы устранить ошибку компиляции, вы просто делаете что-то вроде этого:

@protocol SomeDelegate;

@interface FooThatUsesSomeDelegate : NSObject {
    id<SomeDelegate> delegate_;
}
@end

При прямом объявлении SomeDelegate вам не нужно включать заголовочный файл, где он полностью объявлен Это очень полезно для случаев, когда два класса зависят друг от друга.

Вам нужно будет включить заголовочный файл в исходный файл реализации. Но обычно это не проблема.

0 голосов
/ 10 ноября 2011

С ARC вы теперь используете слабую ссылку для своих делегатов:

@property(weak)id<MyDelegateProtocol> *delegate;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...