2010-01-04 2 views
3

UISwitch 설정에서 파생 된 부울 값을 처리하는 가장 좋은 방법은 무엇이며 영구적 인 설정으로 사용자의 디렉터리에 저장되는 NSMutableDictionary에 저장됩니까? 특히, 부울 값을 파일 시스템에 쓰거나 읽는 NSMutableDictionary의 숫자 값과 구별하는 가장 좋은 방법은 무엇입니까?plist에서 영구 부울을 처리하는 가장 좋은 방법은 무엇입니까?

========

: Adrian과 Ben에게 감사드립니다. 그래서, 결과는 [NSNumber numberWithBool :] (이것은 내가 수행 한 것입니다)를 통해 저장하면 그 값이 부울 값으로 시작되었는지를 결정하는 편리한 방법이 없다는 것입니다.

이 두 번째 부분은 부울 값을 가진 plist를 통해 원래 작성한 NSMutableDictionary를 만드는 것입니다. 이 값들은 NSCFBoolean 클래스를 처음 읽었을 때 가지고 있습니다. 지금 당장의 전략은 사전에있는 값을 plist의 해당 엔트리와 비교하는 것입니다.

이 문제가 중요한 이유는 사용자가이 값을 조작 할 수 있도록 인터페이스 요소를 생성하고 있으며 부울을 UISwitch와 연관 짓고 있기 때문입니다. 번호로 변환하여 원래 클래스를 잃으면 부적절한 사용자 인터페이스 요소가 나타납니다.

배열을 저장된 값으로 대체하는 것이 좋습니다. 첫 번째 값은 저장된 값이고 나머지 항목은 선택 사항입니다. 두 개의 선택 항목이 존재하는 경우, 부울로 처리됩니다. 다른 경우에는, 피커 값으로 사용됩니다. 그러나 이것은 신뢰할 만하면 성 가해 보입니다.

모든 아이디어를 환영 ...

+0

네, NSNumber에서 "objCType"메시지를 사용하십시오. 정수의 경우 "q", 부울 값의 경우 "c", 복식의 경우 "d"를 반환합니다. 나는 당신이 그것을 볼 수있는 방법을 보여줍니다 코드 스 니펫 아래에 내 대답을 편집했습니다. –

답변

11

BOOL 값의 NSNumber의 numberWithBool를 통해 생성의 NSNumber 인스턴스로 직렬화 : 정적 방법 :

BOOL ok = YES; 
NSNumber *value = [NSNumber numberWithBool:ok]; 

// ...later... 

BOOL answer = [value boolValue]; 

BOOL 값을 직렬화하는 다른 방법은 없습니다 있습니다. 생성 된 plist에서 XML로 저장하면 BOOL 값은 < true/> 및 < false/> 엔티티로 표시됩니다. 위 내 의견에 따라

(판, 2010 1월 17일)

은 "objCType"메시지 사용하여 그들이 메모리에로드 할 때의 NSNumber 인스턴스의 다른 서브 타입을 식별하는 데 도움이 코드 조각 :

NSString *path = [[NSBundle mainBundle] pathForResource:@"untitled" 
               ofType:@"plist"]; 
NSArray *array = [NSArray arrayWithContentsOfFile:path]; 

for (id item in array) 
{ 
    NSLog(@"%@", [NSString stringWithCString:[item objCType] 
            encoding:NSUTF8StringEncoding]); 
} 
을 untitled.plist이 구조 갖는다

이 경우

<plist version="1.0"> 
<array> 
    <integer>123</integer> 
    <true/> 
    <real>1.2</real> 
</array> 
</plist> 

은 상기 코드의 실행이 제공 :

01,235,
2010-01-17 17:04:35.100 Untitled[62206:207] q 
2010-01-17 17:04:35.101 Untitled[62206:207] c 
2010-01-17 17:04:35.102 Untitled[62206:207] d 

NSNumber에 저장된 데이터의 내부 유형을 가져 오는 다른 방법이 있을지 모르지만,이 방법을 사용하는 것 같습니다.

+1

몇 가지 추가 정보 :'q '는 64 비트 부호있는 정수를 의미하고,'c'는 ObjC의'char'에'typedef'되어있는'BOOL'을 의미하고,'d'는'double'을 의미합니다. – kennytm

+0

감사합니다. 나는 또한 "i"(32 비트 정수에 대해)를 보았습니다. 이 값에 대한 참조가 있습니까? Xcode에 번들로 제공되는 설명서에서 어떤 것도 발견하지 못했습니다. –

+0

어리석은 저, 답변을 찾았습니다 ... NSNumber 클래스 참조에서 :) "NSNumber의 하위 클래스를 만들면 모든 클래스 클러스터와 마찬가지로 NSNumber의 수퍼 클래스 인 NSValue의 기본 메서드를 재정의해야합니다. 비 원시 메소드의 추상적 인 구현을 이용하기 위해 NSValue 메소드 objCType의 구현이 리턴 할 수있는 제한된 리턴 값 세트가 있습니다. 유효한 리턴 값은 "c", "C", " s ","i ","I ","l ","L ","q ","Q ","f "및"d " –

3

당신이 ID를로 캐스팅해야합니다 NS-무엇이든이를 추가 할 수 있지만 또한, 상수 kCFBooleanTrue 및 kCFBooleanFalse를 사용할 수 있습니다

[myDictionary setObject: (id) kCFBooleanTrue forKey: @"am_I_awesome"]; 
1

CFBoolean 객체가 CoreFoundation에서의 부울 값을 표시하는 데 사용됩니다 plists 및 컬렉션.CFBoolean을 사용하면 특히 타사 소프트웨어와 통신 할 때 최대한의 호환성을 보장합니다.

다음 함수는 CFBoolean 객체의 값을 C 유형 부울로 반환합니다.

Boolean CFBooleanGetValue (CFBooleanRef boolean); 

다음 상수는 true 및 false 개체에 대한 액세스를 제공합니다.

const CFBooleanRef kCFBooleanTrue; 
const CFBooleanRef kCFBooleanFalse; 
관련 문제