2013-02-17 3 views
0

해당 장치에 UIBarButtonSystemItemPageCurl이 있는지 확인하려고합니다.iOS 버전에 UIBarButtonSystemItemPageCurl이 있는지 확인하십시오.

참고 : UIBarButtonSystemItemPageCurl은 iOS 4.0 이상에 있습니다. 또한 iOS 3.1.3을 타겟팅하고 있습니다. iOS 3 부분 타겟팅에 대해서는 걱정하지 마십시오.

는 현재 시도 : if (UIBarButtonSystemItemPageCurl != NULL)

if ((UIBarButtonSystemItemPageCurl) == TRUE)

상수의 존재를 확인하기 위해 (상수로 간주됩니다 UIBarButtonSystemItemPageCurltypedef enum UIBarButtonSystemIcon의 값인가?). 이 두 가지 방법은 현재 작동하지 않습니다. 누군가가 구조체의 값을 확인하는 지침을 제공 할 수 있습니까 (포함 구조체가 아닌)? 감사. 당신이 UIBarButtonItem.h를 보면

+0

'if (& UIBarButtonSystemItemPageCurl! = NULL)'이 (가) 작동합니까? – rmaddy

+0

아니요, 작동하지 않습니다. LLVM 컴파일 오류 : _ 주소 표현은 좌변표 또는 함수 지정자 여야합니다. 앞에있는 '&'(앰퍼샌드)와 어떤 차이가 있습니까? – AnsonL

+0

의미가 있습니다. 내가 제안한 것은 (extern) 상수를 확인하는 방법이다. 그것은 어둠 속에서 총알 값으로 작동 할 수있는 기회였습니다. 솔직히, 나는 enum 값에 대한 런타임 체크가 없다고 생각한다. 'UIDevice systemVersion'을 확인하고'@ "3"'으로 시작하는지 확인해야 할 수도 있습니다. 나는 항상 그런 수표를 싫어하지만 여기있는 유일한 선택 일 수 있습니다. – rmaddy

답변

2

, 당신은 UIBarButtonSystemItemPageCurl 조건부 처리기를 사용하여 정의되는 것을 확인할 수있는 것들 :

typedef NS_ENUM(NSInteger, UIBarButtonSystemItem) { 
    ⋮ 
#if __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED 
    UIBarButtonSystemItemPageCurl, 
#endif 
}; 

…_MAX_ALLOWED는 SDK 버전으로 정의된다. 상수가 정의되면 상수는 항상 존재합니다.

포인터가 아니기 때문에 NULL과 비교하면 의미가 없습니다. 효과를 0과 효과적으로 비교하고 있습니다. 열거 형의 첫 번째 것이 아니기 때문에 0이 아니므로 절대로 NULL이 아닙니다.

내용 입니다. UIBarButtonSystemItemPageCurl23과 동의어이며 OS 버전에 관계없이 항상 23이 존재합니다.

그래서 문제가된다 "UIKit는 인식 UIBarButtonSystemItemPageCurl (일명, 23) 뭔가?"initWithBarButtonSystemItem:target:action:에 전달하고 무슨 일이 일어 나는지하는 것 그 밖으로을 찾을

한 가지 방법은. 잘하면, 그것은 nil을 돌려 주거나 예외를 던질 것이다; 어느 쪽이든, 당신은 그것을 탐지하고 iOS 3 장비에서해야 할 일을 모두함으로써 회복 할 수 있습니다.

또 다른 방법은 ask the device for its systemVersion이며 버전 번호를 이해하는 방식으로 @"4.0"과 비교할 수 있습니다. Growl 프로젝트는 code for parsing and comparing version number strings입니다. OS X 용으로 작성되었지만 iOS에서는 거의 수정하지 않고 작동해야합니다.

먼저 try-it-and-see 방식을 사용합니다. 자동으로 실패하거나 (즉, iOS 3에서도 UIBarButtonItem이 항상 반환되고 3에 도달하는 항목은 작동하지 않습니다.) 운영체제 버전 비교에 의존해야합니다.

+1

상세하게 설명하자면 :'UIBarButtonSystemItemPageCurl'은 열거 형 값입니다. 즉, 컴파일 타임에 존재하고 런타임에는 존재하지 않으므로 메모리에 주소가 없습니다. 이 상황 (열거 형 값 또는 존재하지 않을 수있는 열거 형 값)에서는 명시 적으로 OS 버전을 확인하거나 열거 형 값을 추가 한 OS 버전으로 만 존재하는 선택기 또는 심볼을 확인해야합니다. –

+0

@JonathanGrynspan : 또는 상수를 사용하려고 시도하고 실패하면 복구하십시오. –

+0

나는이 방법을 권장하지 않습니다. 입력이 잘못되면 복구 할 수있는 오류 코드 대신 예외가 throw되거나 어설 션이 실패 할 수 있습니다. 'NSUIntegerMax'를 빈 배열의'- [NSArray objectAtIndex :]'에 넘겨 주면 어떻게되는지 생각해보십시오. –

관련 문제