2010-02-02 6 views
0

행이 선택 될 때마다 ContactsViewController가 있습니다. MessageViewController가 열립니다 (pushViewController 사용). ContactsViewController와 MessageViewController는 모두 DatastoreDelegate 메시지를 수신하기 위해 '등록'합니다. 이상하게도 내 응용 프로그램을로드 할 때 모두 제대로 작동하지만 MessageViewController로 이동하면 내 ContactsViewController의 대리자 메서드가 더 이상 호출되지 않습니다. 이 두 컨트롤러는 모두 [messageAdded : (Message *) message] 메서드를 처리해야하지만 MessageViewController는 메시지가 한 번 열리면 메시지를 계속 수신합니다.대리인이 호출되지 않습니다.

누구나이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

답변

1

코코아에서 대리인이있는 모든 개체는 한 번에 하나의 대리자 만 갖습니다. 이 대리자는 대리자 메시지를 가져 오는 유일한 개체입니다. "두 객체가 대리인 메시지를 수신하도록 등록되었습니다"라는 개념은 없습니다. MessageViewController를 푸시하면 Datastore의 위임자로 설정되고 ContactsViewController는 그 메시지를 다시 보지 않습니다. 다시 설정하지 않기 때문입니다.

코드가 어떻게 구성되어 있는지 알지 못하지만 컨트롤러가보기를 바꿀 때마다 위임자를 손쉽게 전달하여 현재 대리인을 활성화 할 수 있습니다.

코코아에서 알림 패턴 (NSNotificationCenter 참조)은 객체가 여러 다른 객체에 정보를 "브로드 캐스팅"해야 할 때 사용됩니다. 델리게이트는 실제로 그들이 말하는 것처럼 들린다. 다른 객체가 선택적으로 "파트너"와 연결되어 핵심 기능을 제공하는 객체. 알림 관찰자보다 친밀한 관계입니다.

+0

감사합니다. 대표자가 여러 클래스에 메시지를 보낼 수 있다는 인상하에 있었지만이 가정이 잘못되었다고 생각합니다. NotificationCenter를 사용하거나 코드를 구현하는 다른 방법을 찾아 보겠습니다. –

+0

모든 개체가 여러 클래스에 메시지를 보낼 수 있습니다. 일반적으로 클래스는 * 대리자가 아닙니다. 일반적으로 인스턴스를 대리자로 만 만듭니다. 그리고 대리자가있는 모든 개체에는 하나의 대리자 만 있습니다. 동시에 두 개의 객체를 대리자로 사용할 수 없습니다. 원하는 경우 알림을 사용하십시오. –

관련 문제