ИСПОЛЬЗУЙТЕ NSCoding для создания редактируемого пользователем Plist

Я пытаюсь создать редактируемый пользователем plist, в котором пользователь может хранить созданную пользователем процедуру тренировки, включая строки, на которые ссылается другой data.plist в комплекте приложений.

Я предполагаю, что NSCoding - лучший способ сделать это. Пока у меня есть интерфейс, настроенный как панель навигации и табличное представление.

Я хочу, чтобы он был пустым по умолчанию, и пользователь должен нажать «+», который находится в правом верхнем углу панели навигации. Затем он мог ввести имя записи в массиве, например, день груди или день бицепса. И в этом массиве будет словарь или другой массив строк конкретных упражнений на этот день, например, жим лежа или сгибание рук на бицепс.

Этот plist должен быть редактируемым, чтобы он находился в папке документов пользователя, а не в комплекте приложения.

Пример:

Верхний массив состоит из дня груди, дня спины, дня ног. В словаре Chest Day включите жим лежа, тягу к груди, отжимания и т. д.

Обновлять:

Добавление этого метода для поиска файла подпрограммы;

    -(void)loadData
{
    if(YES)
    {
        NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString* routineFile = [documentsPath stringByAppendingPathComponent:@"routine.plist"];
        BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:routineFile];
    }
    else
    {
        //load file
    }
}

person Community    schedule 23.03.2011    source источник
comment
В чем именно заключается ваш вопрос?   -  person Ben Zotto    schedule 23.03.2011
comment
Прости Кихото. Мой вопрос: с чего бы мне начать с попытки реализовать этот редактируемый список? Я знаю, как читать из plist в таблицы, но не знаю, как сделать редактируемый plist, начиная с одного без записей.   -  person    schedule 23.03.2011
comment
Я думаю, что часть сложности заключается в том, чтобы понять, что вы подразумеваете под редактируемым plist. Любой файл .plist доступен для редактирования, если у вас есть соответствующие разрешения на чтение/запись и право собственности. Однако стоит помнить, что plist — это просто формат storage — то, с чем вы будете работать в своем приложении при редактировании данных, — это объекты NSArray, NSDictionary и NSString, а не список.   -  person Sherm Pendley    schedule 23.03.2011
comment
Спасибо, Шерм. Да, я понимаю это. мне нужно, чтобы пользователь мог редактировать содержимое в plist. Таким образом, пользователи могут переупорядочивать элементы в словаре или переупорядочивать словари в корневом массиве. Я не думаю, что это должно быть трудно реализовать.   -  person    schedule 23.03.2011


Ответы (2)


NSCoding — это протокол, используемый NSArchiver, NSKeyedArchiver и т. д., а не для сериализации массива в список свойств.

Забудьте о том, что пользователь собирается редактировать список свойств. Пользователь собирается редактировать данные в вашем приложении — тот факт, что они хранятся в виде списка свойств, — это всего лишь деталь реализации. Когда ваше приложение запускается, вы читаете данные, хранящиеся в файле данных. Пользователь редактирует его, смотрит на него, что угодно. В какой-то момент позже, возможно, после каждого редактирования, возможно, непосредственно перед закрытием приложения, вы записываете данные обратно в файл. Поскольку это список свойств, не беспокойтесь об обновлении файла; у вас уже есть все данные, поэтому напишите совершенно новый список свойств, а затем используйте этот файл для замены старого.

Возможно, я ошибаюсь, и вы действительно хотите, чтобы пользователь редактировал список свойств вручную с помощью текстового редактора. Это было бы ошибкой. Хорошо, что списки свойств удобочитаемы для человека, но если вы попросите пользователей вручную отредактировать ваши файлы необработанных данных, это явный признак того, что ваше приложение не работает. Вся цель вашего приложения — отслеживать эту информацию для пользователя; если бы они хотели использовать текстовый редактор для управления им, им не понадобилось бы ваше приложение. Итак, с учетом сказанного, я надеюсь, что я не ошибаюсь. ;-)

person Caleb    schedule 23.03.2011
comment
Спасибо, Кейбл, да, я понимаю разницу между данными, хранящимися в plist, и самим plist. И вы правы, я не правильно объяснил - я НЕ хочу, чтобы пользователь редактировал plist, только данные, которые в нем хранятся. Как бы я начал этот процесс? Я не могу понять, с чего начать - person ; 23.03.2011
comment
Начать какой процесс? Кажется, у вас есть довольно четкое представление о том, как вы хотите структурировать свои данные. Когда приложение запускается, вы ищете свой файл данных. Если найдете, то прочтете. Если вы его не найдете, вы создаете пустой изменяемый массив, чтобы пользователь мог начать добавлять элементы. Позже, после того как приложение какое-то время сделает свое дело, мы надеемся, что массив не будет пустым, поэтому вы сериализуете его, как описал Шерм Пендли. Подробнее здесь. - person Caleb; 23.03.2011
comment
Спасибо, Калеб. Я редактирую свой исходный пост с помощью нового метода, который я реализую, чтобы проверить, существует ли файл или его нужно создать, или загрузить файл, если он существует. Я на правильном пути? Спасибо. - person ; 23.03.2011
comment
Конечно, но вы также можете просто использовать +arrayWithContentsOfFile: как предложил @Sherm Pendley. Вы получите ноль, если файл не может быть открыт или прочитан в массив. - person Caleb; 23.03.2011
comment
Хорошо, спасибо, Калеб, я прочитал ссылку, но все еще не понял, с чего именно начать. Мне нужно сначала проверить, есть ли данные в ячейках, так как я могу использовать +arrayWithContentsOfFile: для этого? - person ; 23.03.2011
comment
NSArray *myData = [NSMutableArray arrayWithContentsOfFile:@"mydata"]; if (myData == nil) { myData = [NSMutableArray array]; } Теперь у вас есть массив, который вы будете использовать для заполнения таблицы. - person Caleb; 23.03.2011

Я не думаю, что буду использовать NSCoding для этого - если все, с чем вы работаете, это стандартные объекты plist, такие как NSArray, NSDictionary и NSString, метод -writeToFile:atomically: верхнего массива - это простой способ сделать работу.

person Sherm Pendley    schedule 23.03.2011
comment
Хорошо, я думаю, я думал, что NSCoding - это способ сделать это. Я думаю, что не очень ясно сформулировал свой вопрос. С чего бы мне начать, пытаясь реализовать этот редактируемый plist? Я знаю, как читать из plist в таблицы, но не знаю, как сделать редактируемый plist, начиная с одного без записей. - person ; 23.03.2011
comment
NSArray -writeToFile:atomically: создает файл в формате plist - здесь вы начинаете и этим заканчиваете. Нет второго шага. :-) - person Sherm Pendley; 23.03.2011
comment
Точно так же +arrayWithContentsOfFile: считывает файл обратно. - person Sherm Pendley; 23.03.2011