2011-08-14 31 views
15

最近,我在高三,我感興趣的是爲iPhone應用程序。最近,我的一個應用程序出來了:NBlock。這是一款益智遊戲,它非常具有挑戰性。但是,它有一些問題。高分不會被保存。我被告知要使用plist。有小費嗎?如何在iOS的編程中使用的plist

+4

你可以從閱讀[蘋果的plist教程](http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/PropertyLists/QuickStartPlist/QuickStartPlist.html)開始。 – Jon7

回答

12

這個基於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]; 
+1

對我來說,這似乎更清潔,更清晰的使用' - [NSURL URLByAppendingPathComponent:]'文件的URL,而不是相對URL。這將消除對路徑轉義百分比的需要,並且通常不易出錯。 –

3

我會避免使用的plist。到目前爲止,在應用程序中保存簡單數據的最簡單方法是NSUserDefaults

退房this tutorial關於如何使用NSUserDefaults一個簡單的指南。當你完成寫作時,一定要確保synchronizeNSUserDefaults

如果你正在尋找一個更強大的(但更復雜的)的方式來保存數據,看看蘋果的指導使用Core Data

+0

我認爲NSUserDefaults被推薦用於標準化的默認設置,您想要堅持與語言首選項等有關嗎? – cheznead

2

看看到的NSKeyedArchiver /取檔。你幾乎可以節省任何你想要的東西;根據我的經驗,NSUserDefaults會在您將應用從托盤中刪除時轉儲數據。如果使用sqlite等數據庫管理大量數據,核心數據的使用效果會更好。

+1

我從來沒有正確的'同步''NSUserDefaults'這個問題。 – mopsled

+1

我會看看,謝謝。如果你只是保存一個簡單的字符串或類似的東西(我想提名者可能是一個很好的候選人),NSUserDefaults真的只是好,只要它可以永久保存。 –

+0

查看我在答案中添加的鏈接,瞭解如何處理該問題。 – mopsled

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]; 

,並加入新的成績在array聲明做initWithContentsOfFile:@"scores.plist"而不是init。你可以選擇使用NSUserDefaults。

+1

有人可以在PC上格式化我的帖子中的源代碼嗎?它不可能在我的iPod上... – JonasG

+0

+1。值得添加這個基於URL的版本嗎? – Abizern

+0

你是什麼意思? 'writeToURL:自動:'? – JonasG

0

我會說下面的代碼將工作和漂亮的直線前進,除非自定義對象數據類型(它是一個不同的故事再次)使用:

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]; 
    } 
    } 

設置日期屬性可能有助於檢查最後一次分數何時更新。