2011-10-05 3 views
2

장소의 모든 곳을 검색 했음에도 불구하고 내 질문에 대한 답을 찾을 수 없습니다. 모두들 얼마나 좋은지 보자. :)xib의 전 처리기 지침?

나는 10.7 사자에서만 사용할 수있는 NSPopover를 사용하는 응용 프로그램을 만들고 있지만이 응용 프로그램을 10.5 이상으로 컴파일하려고합니다. 전 전 처리기 지시문을 사용하여 트릭을 수행하는 것처럼 보이는 관련 popover 코드를 래핑합니다 ... 그러나 마지막으로 오류가 발생하는 부분은 Interface Builder에서 .zib입니다. Issues Navigator에 표시된 "Class Unavailable : 10.7 이전의 Mac OS X 버전에서 NSPopover"오류를 정리하는 방법은 무엇입니까?

#ifdef __MAC_OS_X_VERSION_MAX_ALLOWED 
    #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 
     @property (assign) IBOutlet NSPopover *popover; 
    } 
    #endif 
#endif 

위의 내용은 xxx.h 및 xxx.m에서 작동하지만 .xib 오류는 어떻게 해결합니까?

오류 (빨간색)에도 불구하고 성공적으로 빌드됩니다. 그러나 나는 10.7의 기능 (popover)이 10.7에서 작동하기를 기대하기에 틀리다. 왜냐하면 그들이하지 않기 때문이다. 내가 무엇을 놓치고 있니?

+1

하나는 10.7+를 타겟팅하고 다른 하나는 타겟팅 <10.7입니까? 또는 10.7 이상에서 실행되는 경우에만 런타임시 동적으로 'NSPopover'를 생성해야하는 단일 바이너리를 빌드하고 있습니까? –

+0

간단히 말해, 10.5 - 10.7에서 실행될 단일 바이너리를 생성하고 10.7을 실행하는 경우 NSPopover를 사용하기를 바랬습니다. – glassfish

+0

@ 글라스 피쉬 그러면 Citron의 대답은 당신이 원하는 것이 아닙니다. 선행 처리기는 컴파일 할 때 실행되며 응용 프로그램이 실행될 OS의 버전을 감지 할 수 없습니다. – hypercrypt

답변

3

프리 프로세서를 사용하지 말고 런타임에 가용성을 확인하려면 NSClassFromString()을 사용해야합니다. 선행 처리기는 컴파일 타임에 실행되므로 응용 프로그램이 실행되는 시스템을 감지하지 못합니다.

10.5, 10.6 및 10.7 각각에 하나씩 세 개의 닙을 만들고 필요한 코드를로드 (또는 코드에서 실행)하지만 컴파일 타임이 아닌 런타임에 하나를 선택하십시오.

MyVC *vc = nil; 
if (NSClassFromString(@"NSPopover")) 
{ 
    vc = [NSViewController initWithNibName:@"MyVC-Lion" bundle:nil]; 
} 
else if (/* check for 10.6+ only features */) 
{ 
    vc = [NSViewController initWithNibName:@"MyVC-SL" bundle:nil]; 
} 
else 
{ 
    vc = [NSViewController initWithNibName:@"MyVC" bundle:nil]; 
} 
// ... 
+1

+1, 이것이 갈 길입니다. 일부 사람들은 전 처리기가 런타임에 실행되지 않는다는 것을 이해하지 못합니다. –

+0

네, 그렇지만 Nxib을 유지 관리해야합니다 ... 일반적인 부분을 다시 작성하기로 결정하면 N 작업을해야합니다. 그리고 최종 응용 프로그램은 훨씬 더 커질 것입니다. 어쩌면 자신의 경우/경험에서 스스로하는 것이 더 낫습니다. 분명히 1 xib 만 관리하는 것을 선호하며 다른 플랫폼을 대상으로 약간의 빌드 스크립트를 사용하는 것이 좋습니다. UI가 클수록 "N xib"방식이 더 고통 스러울 것입니다. 편집 : 또한 필요에 따라 10.7 부분을 초기화하는 데 사용하는 전 처리기를 동적 ​​검사로 바꿀 수 있습니다 (여전히 많은 xib를 피하기 위해 프로그래밍 방식으로) – Citron

+1

@Citron 그런 다음 배포 목표에서 지원하는 가장 복잡한 NIB 만 사용하고 코드에서 쉬지 만 전처리 기보다는 런타임 검사를 사용하지 마십시오. 동일한 OS의 다른 버전에 대해 여러 응용 프로그램을 정말로 관리하고 싶습니까? – hypercrypt

1

귀하의 질문에 사과하지는 않지만 가능한 두 가지 해결 방법은 xib의 2 가지 버전을 만들 수 없으며 대상에 따라 컴파일하거나 다른 방법으로 컴파일 할 수 있습니까? 이것은 유지 보수가 좀 더 힘들 겠지만 UI가 꽤 안정적이라면 이것은 가장 쉬운 방법입니다.

또는 IB를 사용하는 대신 프로그래밍 방식으로 "10.7 특정"UI 구성 요소를 추가 할 수 있습니다. 한두개의 popovers 만 있다면 어렵지 않을 것입니다. 그리고 proprocessor 경호원은 잘 작동 할 것입니다.

+0

아직 시도하지는 않았지만 꽤 효과적인 접근 방식 인 것 같습니다. 고맙습니다! 나는 Objective-C로 발을 딛고있다. 그리고 이것은 나의 첫 번째 프로젝트이다. 그렇다. 나는 매우 멍청하고, 나의 선택권이 아직 무엇인지 확신 할 수 없다. HOW에서 실행중인 OS 버전에 따라 요소를 동적으로로드하는 방법에 대한 정보는 무엇입니까? – glassfish

+0

짧은 답변 : preprocessor :) IB에서 전체 UI를 설정 한 다음 10.7 특정 항목을 프로그래밍 방식으로 추가하고 전 처리기를 사용하여 10.7 또는 10.6 이하로 구축 할 습기를 감지합니다. "요소를 프로그래밍 방식으로 추가하는 방법"에 관해서는, 글쎄요, NSButton 등의 코코아 컨트롤 대부분이 NSView에서 상속 받았다고 생각합니다. NSView에는 addSubview, removeFromSuperView 등 원하는대로 정확히 수행하는 몇 가지 메소드가 있습니다. – Citron

+1

동적으로 확인하지 않고 세 가지 버전의 앱을 빌드해야합니다. – hypercrypt