2011-10-06 63 views
9

所以我有以下方法:從plist中的問題閱讀的NSDictionary與布爾值

- (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); 

} 

它讀取的plist精細,它可以檢測到它有7個按鍵,但是當我嘗試絕版的價值如果是「否」,它會給我32,如果是「是」,則給予我24。我究竟做錯了什麼?

回答

22

valueForKey返回一個id。做到這一點:

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

想我會在這個芯片。首先,如何在plist中定義一個BOOL值?

Apple's DTD for plist給出了一個體面的線索:

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

及更高版本:

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

所有偉大的,但如何做的plist中那個樣子?

那麼,對於一個真正的價值,這將是:

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

當然假的和:

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

從plist中創建一個對象,作爲Objectify敏銳的用戶,我從他們的工廠課程中獲得靈感。我Employee類需要有這些方法:

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

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

    [instance setAttributesFromDictionary:aDictionary]; 
    return instance; 
} 

,反過來呼籲:

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

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

    [self setValuesForKeysWithDictionary:aDictionary]; 

} 

setValuesForKeysWithDictionary:aDictionaryNSKeyValueCoding Protocol的成員。每個NSObject都有這個功能,這意味着作爲NSObject的一個子類,我們的Employee類可以免費獲得。

只要我的Employee類的屬性與plist中指定的鍵值匹配,即employeeId,nameworksRemotely,那麼我就不需要做任何其他操作。該方法將在我的類的實例翻譯的plist中指定正確的值worksRemotely布爾:

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

所有剩下的就是通過plist中內容重複,創造我想要的類的實例,布爾包括:

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]; 
} 

毫無疑問,我已經回答了具體問題的頂部。然而,希望這可以用於其他人,他試圖做我正在嘗試的事情時偶然發現了這個問題,即在plist中創建一個具有布爾值的類。