2010-11-21 2 views
2

Следующие коды записывают «NO» каждый раз. Помощь будет очень признательна!Проблема с чтением значения bool из plist

Код:

NSString *filePath = @"settings.plist"; 
NSDictionary* plistDictionary = [[NSDictionary alloc] initWithContentsOfFile:filePath]; 
if ([[plistDictionary objectForKey:@"hideToolBarInDetailedView"] boolValue] == YES) { 
    detailedView.hidesBottomBarWhenPushed = YES; 
    NSLog(@"YES"); 
} else { 
    detailedView.hidesBottomBarWhenPushed = NO; 
    NSLog(@"NO"); 
} 
[plistDictionary release]; 

settings.plist:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
<key>hideToolBarInDetailedView</key> 
<true/> 
</dict> 
</plist> 

ответ

3

Я подозреваю, что файл PLIST не в текущем рабочем каталоге и NSDictionary возвращаемый initWithContentsOfFile: пуста или ноль. Вы можете проверить это, войдя plistDictionary:

NSLog(@"%@", plistDictionary); 

Одним решением было бы указать полный путь к файлу Plist. Или, если значения, сохраненные в файле plist, являются предпочтениями, вы можете использовать NSUserDefaults.

0

Это сработало для меня. Возможно, что в вашем случае не найдет ваш файл, и в этом случае plistDictionary будет равен нулю, и это приведет к выходу вывода, который вы видите, попробуйте добавить проверку, что вызов init фактически возвращает вам словарь, а не ноль.

0

Поскольку объект для ключа может быть также другой класс, boolValue может Buggie (может генерировать исключение, если не класс NSNumber) и то, что солгал, если это число 0 или 1, это мое решение:

- (BOOL)isBooleanKey:(id)key 
{ 
#ifndef kNullString // can be somewhere 
#define kNullString @"(null)" 
#endif 
    if (!key){ 
     NSLog(@"WARNING:[- (BOOL)%@(id)key, \"key\" is nil]\n", NSStringFromSelector(_cmd)); 
     return NO; 
    } 
    if ([key isKindOfClass:[NSNumber class]]) { 
     NSDictionary *dict = [NSDictionary dictionaryWithObject:key forKey:@"test"]; 

     if (!dict) return NO; 

     NSError *err = nil; 
     NSPropertyListFormat fmt = NSPropertyListXMLFormat_v1_0; 

     id data = [NSPropertyListSerialization dataWithPropertyList:dict format:NSPropertyListXMLFormat_v1_0 options:0 error:&err]; 
     if(!data) { 
      NSLog(@"dict is not a XMLFormat v1\n"); // anyway this can't be happen here, unless something is really bad! 
     } 

     id pl =[NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainersAndLeaves format:&fmt error:&err]; 
#if 0 
     NSLog(@" err: %@", err.localizedDescription); 
#endif 
     if(!pl) { 
      [NSException raise: NSParseErrorException format:@"%@\n", err]; 
      if(![data isKindOfClass:[NSDictionary class]]) 
       [NSException raise: NSParseErrorException 
          format: @"dict does not contain a property list\n"]; 
     } 
     NSString* plist = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
     if (plist.length < 1 || [plist isEqualToString:kNullString]) return NO; //kNullString is a macro -> @"(null)" 

     // dict has only one key, so if it's not soup is soaked bread! 
     if ([plist rangeOfString:@"<true/>"].location != NSNotFound 
      || [plist rangeOfString:@"<false/>"].location != NSNotFound) { 
      // object for key is a boolean for sure (not simply a number!) 
      return YES; 
     } 
    } 
    // key is not a boolean 
    return NO; 
} 

Никаких исключений, и сказать вам правду!

if ([self isBooleanKey:[someobject forKey:@"some key"]]]) { 
    // Yes 
} else { 
    // NO 
} 
Смежные вопросы