Проблема чтения значения bool из plist - PullRequest
2 голосов
/ 21 ноября 2010

Следующий код регистрирует «НЕТ» каждый раз.Помощь будет очень признателен!

Код:

 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 ]

3 голосов
/ 21 ноября 2010

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

NSLog(@"%@", plistDictionary);

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

0 голосов
/ 28 июля 2015

Поскольку объект для ключа также может быть другим классом, boolValue может вызывать ошибку (может генерировать исключение, если не класс 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
}
0 голосов
/ 21 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...