чтение файла plist дает сбой

прочитайте в загрузке:

 NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath: path]) //4
{
    NSString *bundle = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"]; //5

    [fileManager copyItemAtPath:bundle toPath: path error:&error]; //6
}

//load in text fields.
NSMutableDictionary *savedData = [[NSMutableDictionary alloc] initWithContentsOfFile: path];

nameField.text = [[savedData objectForKey:@"name"] stringValue];
locationTextField.text = [[savedData objectForKey:@"location"] stringValue];
sectorTextField.text = [[savedData objectForKey:@"sector"] stringValue];

Напишите при нажатии кнопки:

    - (IBAction)writingButton:(id)sender
{
    NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile: path];

    //[data setObject:[NSNumber numberWithInt:value] forKey:@"value"];
    [data setObject:[NSString stringWithString:nameField.text] forKey:@"name"];
    [data setObject:[NSString stringWithString:locationTextField.text] forKey:@"location"];
    [data setObject:[NSString stringWithString:sectorTextField.text] forKey:@"sector"];
}

файл plist:

введите описание изображения здесь

Ошибка:

2012-09-04 17: 03: 40.360 приложение [4849: c07] - [__ NSCFString stringValue]: нераспознанный селектор отправлен в экземпляр 0x6aa38f0 2012-09-04 17: 03: 40.362 приложение [4849: c07] *** Срок завершения приложения для неперехваченного исключения 'NSInvalidArgumentException', причина: '- [__ NSCFString stringValue]: нераспознанный селектор отправлен в экземпляр 0x6aa38f0'

Любые идеи? ваше здоровье.


person dev6546    schedule 04.09.2012    source источник
comment
А также прочтите сообщение об ошибке. Это на простом, понятном английском языке.   -  person    schedule 04.09.2012
comment
Я не знал id, мне нужен был другой селектор (я работал с приложениями ios за пределами cocos2d около полутора месяцев, так что я все еще учусь)   -  person dev6546    schedule 04.09.2012
comment
значение в plist уже имеет тип String, тогда почему вы хотите привести их к типу с помощью [[savedData objectForKey: @name] stringValue]. Просто используйте [[savedData objectForKey: @name] и так далее.   -  person Vimal Venugopalan    schedule 04.09.2012
comment
@ dev6546 Понятно :) Но все же в документации NSDictionary четко указано, как это работает.   -  person    schedule 04.09.2012


Ответы (1)


Словарь хранит объекты NSString напрямую - нет необходимости вызывать (несуществующий) метод с именем - stringValue. Просто напишите

nameField.text = [savedData objectForKey:@"name"];

и так далее.

(Как вы думаете, почему был необходим этот вызов метода?)

person Community    schedule 04.09.2012
comment
Большое спасибо за это, понимаете, почему код внутри моей кнопки не работает? Чтение сейчас работает нормально, но писать нет, я также пробовал переместить код в didClose, но мне это тоже не нравится. - person dev6546; 04.09.2012
comment
@ dev6546 что значит запись не работает? Разве значения в NSMutableDictionary не установлены? - person ; 04.09.2012
comment
Все три являются uiTextFields, два из которых устанавливаются в: - (void) pickerView: (UIPickerView *) thePickerview didSelectRow: (NSInteger) row inComponent: (NSInteger), а последний просто настраивается с помощью клавиатуры. Но когда я закрываю и открываю приложение, они не сохраняются. Он загружает файлы из файла plist в папку моих ресурсов. - person dev6546; 04.09.2012
comment
@ dev6546, конечно, нет. Вы не записываете содержимое словаря. Установка значений экземпляра словаря в памяти, очевидно, не меняет значений в самом файле. Кроме того, вы не можете обновлять / записывать файлы в свой пакет приложений (он доступен только для чтения из соображений безопасности) - вы должны сохранить свой файл plist в каталоге Documents или Library, а затем использовать метод NSDictionary writeToFile:atomically: для фактического сохранения изменений. - person ; 04.09.2012