Сбой при попытке сохранить значения BOOL в .plist для переменной BOOL в файле реализации - PullRequest
1 голос
/ 14 декабря 2011

У меня есть .plist, созданный при запуске приложения со следующим кодом (MyAppTableViewController):

NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *finalPath = [documentsDirectory stringByAppendingPathComponent:@"Settings.plist"];

BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:finalPath];

if (!fileExists) {
    NSLog(@"Creating file");
    NSDictionary *plistDict = [[NSDictionary alloc]initWithObjectsAndKeys:@"1",@"Fade out",@"1",@"Enable Gestures",@"1",@"Proximity Sensor",@"1",@"Keep screen ON",nil];
    NSString *error = nil;

    NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];

    if(plistDict) {
        [plistData writeToFile:finalPath atomically:YES];
    } else {
        NSLog(@"Error: %@", error);
        [error release];
    }
}

Это прекрасно работает, и файл создается с ключами и значениями. Затем у меня есть таблица с четырьмя переключателями с функцией toggle: в качестве селектора.

Код внутри -(void)toggle:(id)sender берет значение переключателя вместе со строкой indexPath и соответственно изменяет plist:

-(void)toggle:(id)sender {
    UISwitch *aSwitch = (UISwitch *)sender;
    UITableViewCell *cell = (UITableViewCell *)aSwitch.superview;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];    

    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *finalPath = [documentsDirectory stringByAppendingPathComponent:@"Settings.plist"];
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:finalPath];

    if (indexPath.section == 0 && indexPath.row == 0) {
        [dictionary setObject:[NSNumber numberWithBool:aSwitch.on] forKey:@"Fade out"];
    }
//There are further (similar) else if statements, but I'll leave them out.

    NSString *error = nil;
    NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:dictionary format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];

    if(dictionary) {
        [plistData writeToFile:finalPath atomically:YES];
    } else {
        NSLog(@"Error: %@", error);
        [error release];
    }
}

Это также работает нормально и успешно изменяет plist. Моя проблема возникает, когда я пытаюсь получить данные с помощью следующего кода:

NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *finalPath = [documentsDirectory stringByAppendingPathComponent:@"Settings.plist"];
NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:finalPath];

fadeOut = [[NSString stringWithFormat:[dictionary objectForKey:@"Fade out"]]boolValue];
proximitySensor = [[NSString stringWithFormat:[dictionary objectForKey:@"Proximity Sensor"]]boolValue];
enableGestures = [[NSString stringWithFormat:[dictionary objectForKey:@"Enable Gestures"]]boolValue];
keepScreenOn = [[NSString stringWithFormat:[dictionary objectForKey:@"Keep screen ON"]]boolValue];

В файле декларации я определил BOOL fadeOut,proximitySensor,enableGestures,keepScreenOn;. Сбор информации работает нормально, но когда я изменяю значения BOOL, приложение вылетает. Я не совсем понимаю, в чем проблема. Возможно, мне не хватает общей картины или простой, но важной ошибки с логическими значениями.

Если я удаляю приведенный выше код, все работает нормально. Но если я оставлю это там, приложение вылетает со следующим сообщением:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFBoolean length]: unrecognized selector sent to instance 0x3f39a9f0'

Помощь очень ценится!

1 Ответ

1 голос
/ 14 декабря 2011

Если вы посмотрите на эту строку

fadeOut = [[NSString stringWithFormat:[dictionary objectForKey:@"Fade out"]]boolValue]

Вы инициализируете строку из NSNumber (вы сохранили BOOL в NSNumber).Это неверно само по себе.

Если вам нужно значение bool NSNumber, просто используйте boolValue.

fadeOut = [[dictionary objectForKey:@"Fade out"] boolValue];

Это верно для всех случаев, когда вы получаете логическое значение.

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