2010-02-02 3 views
0

У меня есть ContactViewController, который - при каждом выборе строки - MessageViewController открывается (с помощью pushViewController). Как ContactViewController, так и MessageViewController 'register', чтобы получать сообщения DatastoreDelegate. Странно, что все это прекрасно работает при загрузке моего приложения, но как только я перейду к MessageViewController, методы делегата на моем ContactViewController больше не вызываются. Оба этих контроллера должны обрабатывать метод [messageAdded: (Message *)], но только MessageViewController продолжает получать сообщения после того, как он был открыт один раз.Делегат, не вызываемый

Есть ли у кого-нибудь идеи о том, как сделать эту работу?

ответ

1

В какао каждый объект с делегатом имеет только один делегат (в любой момент времени). Этот делегат является единственным объектом, который получает сообщения делегата. Нет реальной концепции, что «оба объекта зарегистрированы для приема сообщений делегатов». Мое подозрение здесь в том, что когда вы нажимаете MessageViewController, он устанавливает себя как делегат Datastore, а затем ContactViewController никогда не видит эти сообщения снова, потому что он не возвращается.

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

В какао шаблон уведомления (см. NSNotificationCenter) используется, когда объект должен «передавать» информацию нескольким другим объектам. Делегаты - это то, на что они похожи: объект, который другой объект необязательно полагается на «партнерство» с ним и предоставляет ключевые функции. Это более близкие отношения, чем наблюдатель уведомлений.

+0

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

+0

Любой объект может отправлять сообщения нескольким классам. Классы обычно * не являются * делегатами; вы обычно делаете только экземпляр делегата. И любой объект, у которого есть делегат, имеет только один делегат; два объекта не могут быть его делегатом одновременно. Используйте уведомления, если вы этого хотите. –

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