2009-05-25 6 views
6

인터페이스 빌더의 IBAction-s에 연결할 수 있도록 UIView 하위 클래스에 대한 이벤트를 등록하는 가장 좋은 방법은 무엇입니까?사용자 정의 UIView에 대한 이벤트

현재 표준 UIView를 기본보기에 놓은 상태에서 클래스를 "RadioDial"(사용자 정의 클래스)으로 설정했습니다. 이보기를 잘 표시합니다,하지만 그것을 밖으로 이벤트를 얻으려면 어떻게 생각하지 않습니다. (당신이 프로젝트에 아무것도, 당신은 RootViewController이 없어야 경우)

감사

답변

5

다음과 같은 사실을 명심하십시오 : 인터페이스 빌더가보기 하위 클래스가 방출 할 사용자 정의 이벤트를 연결하기 위해 Interface Builder에 제공하고 싶습니다 (Button 컨트롤을 사용하여 Touch Inside 등을 연결할 수 있음).

이 기능이 필요한 경우 프로토콜과 결합 된보기에서 일반화 된 '대리인'속성을 사용해야합니다.

@protocol RadioDialDelegate 
-(void)dialValueChanged:(id)sender 
@end 

@interface RadioDial 
{ 
    id<RadioDialDelegate> radioDelegate; 
} 
@property (nonatomic, assign) IBOutlet id<RadioDialDelegate> radioDelegate; 

이 컨트롤러가 (이 RadioDialDelegate를 구현 가정)보기로 묶을하고 뷰에서 나오는 이벤트를받을 수 있습니다. 또는 형식이 지정되지 않은 대리자를 사용할 수 있으며보기 코드에서 늦은 전화를 사용하십시오.

if([radioDelegate respondsToSelector:@selector(dialValueChanged:)]) { 
    [radioDelegate dialValueChanged:self]; 
} 
+0

예, 정확히 그 의미입니다. 그리고 내가 겪고있는 문제는 내 뷰 하위 클래스에 대한 사용자 지정 이벤트를 만드는 것입니다. 실제 상황은 클래스에서 - (void) touches 특정 조건에서 움직 였고 화재와 이벤트를 원했고 해당 이벤트를 IB를 통해 IBActions에 연결할 수 있기를 바랍니다. –

+0

나는 어떻게 대답했는지 나의 대답을 편집했다. 이를 수행하려면 위임/프로토콜 패턴을 활용해야합니다. IB는 컨트롤러에 할당 된 속성으로 위임자를 노출합니다 (IB에서 컨트롤러 클래스를 올바르게 설정해야 함) 컨트롤러가 프로토콜을 구현해야합니다. – Jason

+0

일종의 의미가 있습니다 (전체 Objective-C/Cocoa에 상당히 익숙 함), 어떻게하면 각 RadioDial의 값 변경 이벤트를 뷰 컨트롤러의 다른 메서드로 연결시킬 수 있습니까? 동일한 방법을 사용하고 발신자 참조를 확인할 수 있다는 것을 알고 있지만 그 유일한 방법입니까? –

3

은 뷰 컨트롤러의 메소드를 만듭니다.

-(IBAction) buttonClicked; 

을 그리고 IB에 당신은 당신의 버튼/라디오 다이얼을/어떤 마우스 오른쪽 단추로 클릭하십시오의 당신의 방법은 당신이 다음 넣어 컨트롤러의 헤더 파일 (예를 들어 RootViewController.h)에서

-(void) buttonClicked { code code code } 

입니다 가정 해 봅시다. 이벤트 목록이 표시되고 컨트롤러에서 수신 할 이벤트의 커넥터에서 컨트롤러 (아마도 첫 번째 응답자)를 나타내는 IB의 개체로 끌 수 있습니다. 이것은 IB 구조가 어떻게 설정되어 있느냐에 달려 있지만 간단해야합니다.

또 다른 대안은 프로그래밍 방식으로 UIView를 만드는 방법을 배우고 잠시 IB를 잊는 것입니다. 초기에 IB를 사용하는 법을 배우는 것이 더 나은지 아니면 나중에 코드를 작성하고 IB를 저장하는 것이 더 나은지에 대한 의견이 나누어 져 있습니다. 어쨌든 어떤 시점에서 인터페이스를 설정하는 두 가지 방법을 배우는 것이 필요합니다.

관련 문제