Как использовать pList в iOS-программировании
Недавно я старшеклассник, и я заинтересован в создании приложений для iPhone. Недавно появилось одно из моих приложений: NBlock. Это приложение для головоломки, и это очень сложно. Однако у него есть несколько проблем. Высокие баллы не сохраняются. Мне сказали использовать plist. Любые советы?
Ответы
Ответ 1
Метод, основанный на URL-адресе для этого:
// Get the URL for the document directory
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSURL *documentDirectoryURL = [[fileManager URLsForDocumentDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] objectAtIndex:0];
// Turn the filename into a string safe for use in a URL
NSString *safeString = [@"scores.plist" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// Create an array for the score
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:[NSNumber numberWithInt:score]];
// Write this array to a URL
NSURL *arrayURL = [NSURL URLWithString:safeString relativeToURL:documentDirectoryURL];
[array writeToURL:arrayURL atomically:YES];
Ответ 2
Я бы избегал использовать plist. Самый простой способ сохранить простые данные в приложении, на самом деле, NSUserDefaults
.
Ознакомьтесь с этот учебник для простого руководства по использованию NSUserDefaults
. Всегда выполняйте synchronize
NSUserDefaults
, когда вы закончите писать им.
Если вы ищете более мощный (но более сложный) способ сохранения данных, посмотрите руководство Apple на использование Core Data
.
Ответ 3
Вот что вы хотите:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"scores.plist"];
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:[NSNumber numberWithInt:score]];
[array writeToFile:path atomically:YES];
И чтобы добавить новые оценки, сделайте initWithContentsOfFile:@"scores.plist"
вместо init
в объявлении array
. Вы можете дополнительно использовать NSUserDefaults.
Ответ 4
Взгляните на NSKeyedArchiver/Unarchiver. Вы можете сэкономить все, что захотите; NSUserDefaults, по моему опыту, сбрасывает ваши данные, если вы убиваете приложение из лотка. Основные данные действительно используются лучше, если вы управляете большими объемами данных с такими базами данных, как sqlite.
Ответ 5
Я бы сказал, что приведенный ниже код будет работать и довольно прямолинейно, если не будут использоваться типы данных пользовательских объектов (его другая история):
NSString* plistPath = nil;
NSFileManager* manager = [NSFileManager defaultManager];
if ((plistPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"PathTo.plist"]))
{
if ([manager isWritableFileAtPath:plistPath])
{
NSMutableDictionary* infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
[infoDict setObject:@"foo object" forKey:@"fookey"];
[infoDict writeToFile:plistPath atomically:NO];
[manager setAttributes:[NSDictionary dictionaryWithObject:[NSDate date] forKey:NSFileModificationDate] ofItemAtPath:[[NSBundle mainBundle] bundlePath] error:nil];
}
}
установка атрибута даты может быть полезна для проверки того, когда последний балл был обновлен.