2012-09-10 4 views
5

UITextField와 같은 UI 컨트롤이 필수 프로토콜을 지원하는 클래스로 정의 된 대리인을 통해 클라이언트 상호 작용/이벤트를 알았습니다.멀티 캐스트 대리자 - iOS의 UI 컨트롤에서 알림을받는 여러 클래스

나는 종종 하나 이상의 클래스에서 UI 이벤트에 대한 알림을 받고 싶어하므로 멀티 캐스팅을 지원하려고합니다. 예를 들어 UI 컨트롤에 둘 이상의 대리자를 지정합니다. 나는 이것을 지원하는 IOS 프레임 워크 기능이 없다고 확신한다. 나는 누군가가이 문제에 대한 적절한 해결책을 생각해 냈는지 궁금해하고 있었다.

답변

6

상대적으로 쉽게 멀티 캐스트 대리인을 만들 수있는 코코아 기능이 있습니다. Message Forwarding 시스템이 프레임 워크에 내장되어 있습니다.

forwardInvocation:을 무시하고 위임자 대신 개체의 인스턴스를 반환하는 클래스를 만듭니다. 이것은 종종 "트램펄린 개체"라고도합니다입니다. forwardInvocation: 구현 내부의 로직은 이제 어떤 "실제"객체가 메시지를 받아야하는지 결정할 수 있고 하나 또는 그 이상의 객체로 호출을 전달할 수 있습니다.

http://www.scottlogic.co.uk/blog/colin/2012/11/a-multicast-delegate-pattern-for-ios-controls/

+0

감사 :

여기 구현을 참조하십시오. 나는 이것을 사용하여 필요한 것을 만들 수 있다고 생각한다. – ColinE

+0

Collin의 예에서 누락 된 사항은 다음과 같습니다. signature = [NSMethodSignature signatureWithObjCTypes : "@^v^c"]; to (NSMethodSignature *) methodSignatureForSelector : (SEL) aSelector 메서드입니다. – iosDeveloper

1

당신은 클래스에 UI 제어를 구현할 수, 다음 클래스가이 UI에서 알림을 받게됩니다 :이 허용 대답에 대한 업데이트로

, 나는 여기에 내 자신의 멀티 캐스팅 위임 구현을 생성 , 다른 클래스에 메시지를 보낼 수 있습니다 (동일한 델리게이트 기술을 사용하여 - 퍼스트 클래스에서 델리게이트 속성을 구현 한 다음, 두 번째 클래스에서 1 차 클래스의 델리게이트 메소드를 구현합니다). 예를 들어,의 UITextField 방법 -textFieldDidEndEditing 님

제 클래스 -

1) 구현 프로토콜 :

@protocol TextControllerDelegate <NSObject> 

@optional // Delegate protocols 
- (void)textFieldDidEndEditing:(UITextField *)textField; 

@end 

2) @property (nonatomic, unsafe_unretained, readwrite) id <TextControllerDelegate> delegate;

3) 방법 - (void)textFieldDidEndEditing:(UITextField *)textField 클래스 안쪽 , 전화 [delegate textFieldDidEndEditing:textField]

두 번째 클래스에서 :

1) 퍼스트 클래스의 객체를 구현하고 대리자를 셀프 (두 번째 클래스)로 설정합니다.

2) 구현 방법 - 멀티 캐스팅을 지원하는 (void)textFieldDidEndEditing:(UITextField *)textField

2

한 기술은 당신의 위임 클래스를 다음과 같은 방법을 제공하는 것입니다 :

@interface Delegator : NSObject - (void)addDelegate:(id<MyProtocol>)delegate; - (void)removeDelegate:(id<MyProtocol>)delegate; @end

NSHashTable의 대표에 대한 참조를 저장합니다. 내가 알고하지 않았다 매우 흥미로운 언어 기능을 강조하기위한 http://arielelkin.github.io/articles/objective-c-multicast-delegate/