2011-03-03 2 views
1

예를 들어, 유료 버전과 무료 버전의 여러 빌드가 있고 어떤 빌드에 따라 다른 인터페이스를 갖고 싶다면 인터페이스를 혼란스럽게하는 것 같습니다. 작성자. 내가 IB에 MyViewController.xib을로드인터페이스 빌더를 혼동하지 않고 컴파일 할 때 다른 인터페이스 선언을 사용하는 방법

// MyViewController.h 
#ifdef FREE 
@interface MyViewController : NSObject <UIActionSheetDelegate, ADBannerViewDelegate> 
#else 
@interface MyViewController : NSObject <UIActionSheetDelegate> 
#endif 
{ 
    IBOutlet UILabel* myLabel; 
} 
- (IBAction) myAction:(id)sender; 

, 그것은 '파일의 소유자'의 'myLabel'출구 '내보기'에 연결되어 "같은 정보 창에서 경고를 보여줍니다 예를 들어

그러나 'myLabel'은 더 이상 MyViewController에 정의되어 있지 않습니다. "

IB를 혼동하지 않도록 할 수있는 방법이 있습니까?

다른 옵션은 #ifdef가 아니며 모든 빌드에 대해 하나의 정의 만 있다고 가정합니다. ADBannerViewDelegate (iOS 4가 필요함)를 준수하는 컨트롤러로 구축하고 iOS 3.2에 배포하면 어떻게됩니까? 그게 효과가 있다면 어쩌면 아무런 문제가 없습니다.

답변

2

IB가 사용중인 구조를 이해할 수있는 방법을 찾지 못했습니다 (유료/무료 앱으로 해보려고했습니다. 과거에 만들어진). 이것은 내가 내 문제를 해결하는 방법이다 :

필자는 @interface 정의에서 조건부 컴파일을 사용하지 않았다. 유료, 비 광고 버전 인 것처럼 수업을 정상적으로 정의했습니다. MyPaidViewController라고 부르 자.

@interface MyPaidViewController : UIViewController <UIActionSheetDelegate> { 

그런 다음 무료 버전 용 MyPaidViewController 하위 클래스를 만들었습니다. 뭔가 같은 : 난 보통 (필자는 광고를위한 공간을 확보하기 위해 주위에 물건을 이동했기 때문에) 내 유료 버전에 대한보다 내 무료 버전에 대해 다른 XIB를 사용하는 데 필요한 때문에

@interface MyFreeViewController : MyPaidViewController <ADBannerViewDelegate> { 

난 그냥 것 유료 xib는 File 's Owner로 MyPaidViewController를 사용하고 Free xib는 MyFreeViewController를 File 's Owner로 사용하십시오.

인터페이스 빌더는 수퍼 클래스의 IBOutlet도 볼 수 있으므로 무료 xib에서 myLabel을 참조 할 수 있습니다.

MyPaidViewController가 유료 및 무료 빌드 대상이지만 MyFreeViewController는 무료 빌드 대상에만 포함되어야합니다.

+0

+1은 조금 더 많은 작업이 필요하지만 코드 전체에 다른 #ifdef를 뿌리지 않아도 좋은 이점이 있습니다. 이 문제를 해결하기 위해 상속을 사용하는 것이 왜 발생하지 않았는지 나는 알지 못합니다. 매우 우아한 솔루션, 감사합니다! – zpasternack

관련 문제