2011-10-06 24 views
9

Vì vậy, tôi có phương pháp sau đây:đọc một NSDictionary từ phát hành plist với giá trị BOOL

- (void)readPlist 
{ 

    NSString *path = [[NSBundle mainBundle] pathForResource:@"States" ofType:@"plist"];  
    self.data = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; 

    BOOL value = (BOOL)[self.data valueForKey:@"Arizona"]; 
    NSLog(@"VALUE IS %d", value); 

} 

Nó đọc tốt plist, nó có thể phát hiện rằng nó có 7 phím, tuy nhiên khi tôi cố gắng để in giá trị ra nó mang lại cho tôi 32 nếu nó là số không và 24 nếu nó là có. Tôi đang làm gì sai?

Trả lời

22

valueForKey trả về id. Thực hiện việc này:

NSNumber * n = [self.data valueForKey:@"Arizona"]; 
BOOL value = [n boolValue]; 
1
- (void)readPlist 
{ 

NSString *path = [[NSBundle mainBundle] pathForResource:@"States" ofType:@"plist"];  
self.data = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; 

BOOL value = [[self.data valueForKey:@"Arizona"] intValue]; 
NSLog(@"VALUE IS %i", value); 

} 
0

Tôi nghĩ rằng tôi sẽ tiếp tục điều này. Điều đầu tiên là, làm thế nào để tài sản xác định một giá trị BOOL trong plist của bạn?

Apple's DTD for plist cho một đầu mối đàng hoàng:

<!ENTITY % plistObject "(array | data | date | dict | real | integer | string | true | false)" > 

và sau:

<!-- Numerical primitives --> 
<!ELEMENT true EMPTY> <!-- Boolean constant true --> 
<!ELEMENT false EMPTY> <!-- Boolean constant false --> 

Tất cả tuyệt vời, nhưng làm thế nào mà cái nhìn trong plist?

Vâng, đối với một giá trị đúng, nó sẽ là:

<dict> 
     <key>employeeId</key> 
     <integer>1</integer> 
     <key>name</key> 
     <string>Joe Smith</string> 
     <key>worksRemotely</key> 
     <true/> 
    </dict> 

và tất nhiên cho sai:

<dict> 
     <key>employeeId</key> 
     <integer>1</integer> 
     <key>name</key> 
     <string>Joe Smith</string> 
     <key>worksRemotely</key> 
     <false/> 
    </dict> 

Để tạo một đối tượng từ plist, như một người dùng quan tâm của Objectify, Tôi lấy cảm hứng từ các lớp nhà máy của họ. lớp Employee của tôi sẽ có những phương pháp:

+ (Employee *)instanceFromDictionary:(NSDictionary *)aDictionary { 

    Employee *instance = [[Employee alloc] init]; 

    [instance setAttributesFromDictionary:aDictionary]; 
    return instance; 
} 

mà lần lượt gọi:

- (void)setAttributesFromDictionary:(NSDictionary *)aDictionary { 

    if (![aDictionary isKindOfClass:[NSDictionary class]]) { 
     return; 
    } 

    [self setValuesForKeysWithDictionary:aDictionary]; 

} 

setValuesForKeysWithDictionary:aDictionary là một thành viên của NSKeyValueCoding Protocol. Điều đó có sẵn với mỗi NSObject có nghĩa là như một lớp con của NSObject, lớp học Employee của chúng tôi nhận được điều đó miễn phí.

Miễn là thuộc tính lớp nhân viên của tôi khớp với các giá trị khóa được chỉ định trong plist, cụ thể là employeeId, nameworksRemotely, thì tôi sẽ không cần phải làm gì khác. phương pháp mà sẽ dịch các worksRemotely boolean xác định trong plist với giá trị đúng trong trường hợp lớp học của tôi:

@property (assign, nonatomic, getter = isWorkingRemotely) BOOL worksRemotely; 

Tất cả những gì còn lại là để lặp qua các nội dung plist, tạo các instance của lớp tôi mong muốn, bool bao gồm:

NSString *plistPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"employees" ofType:@"plist"]; 
NSArray *employeeDictionaries = [NSArray arrayWithContentsOfFile:plistPath]; 
for (NSDictionary *employeeDict in employeeDictionaries) { 
    Employee *employee = [Employee instanceFromDictionary:employeeDict]; 
    [employees addObject:employee]; 
} 

Không nghi ngờ gì tôi đã vượt qua hàng đầu để trả lời câu hỏi cụ thể. Tuy nhiên, hy vọng điều này có thể được sử dụng cho một người khác tình cờ gặp câu hỏi này trong khi cố gắng làm những gì tôi đang cố gắng, tức là tạo ra một lớp học với một giá trị boolean trong một plist.

Các vấn đề liên quan