2011-10-06 10 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 एक आईडी देता है। ऐसा करें:

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

सोचा कि मैं इस पर चिपकूँगा। सबसे पहले बात यह है कि संपत्ति को कैसे अपनी पुल में एक बूल वैल्यू परिभाषित किया जाए?

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

और बाद में:

Apple's DTD for plist एक सभ्य सुराग देता है

<!-- 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> 

Objectify की एक गहरी उपयोगकर्ता के रूप में plist से एक वस्तु बनाने के लिए, मैं उनके कारखाने वर्गों से प्रेरणा लेता हूं। मेरे 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 कक्षा इसे मुफ्त में प्राप्त करती है।

जब तक मेरी कर्मचारी वर्ग 'गुण plist, अर्थात् employeeId, name, और worksRemotely में निर्दिष्ट कुंजी मूल्यों के साथ मेल खाते हैं, तो मैं कुछ और करने की जरूरत नहीं होगी। यही कारण है कि विधि मेरी कक्षा उदाहरण में worksRemotely बूलियन सही मान को plist में निर्दिष्ट अनुवाद करेगा:

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

अब सिर्फ़ plist सामग्री के माध्यम से पुनरावृति करने के लिए है, मेरे वांछित वर्ग के उदाहरण बनाने, bool शामिल:

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

कोई संदेह नहीं है कि मैं विशिष्ट प्रश्न का उत्तर देने के लिए शीर्ष पर थोड़ा सा चला गया हूं। हालांकि उम्मीद है कि यह किसी अन्य व्यक्ति के लिए उपयोग किया जा सकता है जो इस सवाल पर ठोकर खा रहा था कि मैं जो कोशिश कर रहा था, करने की कोशिश कर रहा था, यानी एक प्लेलिस्ट में एक बूलियन मूल्य के साथ एक वर्ग बनाएं।

संबंधित मुद्दे