2013-07-02 70 views
0

在我的應用程序中,我有一個UITableView和2個按鈕「保存」和「加載」。在我的情況下,當用戶保存他或她的軌道時,我的UITableView會添加一個新的單元格與他們軌道的標題,然後當用戶點擊單元格時,它將重新加載他們的軌道。這工作正常,但每當用戶保存一個軌道,然後嘗試保存另一個,新添加的單元格只重新加載一個軌道。所以,我的tableview可以有10個有名字的單元格,但每當你點擊一個單元格時,只保存一個曲目。所以我的問題是,我如何保存每個單元格的數據?這裏是我的節電功能:UITableView單元格不能正確保存數據?

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
[userDefaults setObject:NSStringFromCGPoint(ball.center) forKey:@"ballPosition"]; 
[userDefaults synchronize]; 

NSUserDefaults *block1DF = [NSUserDefaults standardUserDefaults]; 
[block1DF setObject:NSStringFromCGPoint(block1.center) forKey:@"block1Position"]; 
[block1DF synchronize]; 

NSUserDefaults *block2DF = [NSUserDefaults standardUserDefaults]; 
[block2DF setObject:NSStringFromCGPoint(block2.center) forKey:@"block2Position"]; 
[block2DF synchronize]; 

NSUserDefaults *block3DF = [NSUserDefaults standardUserDefaults]; 
[block3DF setObject:NSStringFromCGPoint(block3.center) forKey:@"block3Position"]; 
[block3DF synchronize]; 

NSUserDefaults *winBlockDF = [NSUserDefaults standardUserDefaults]; 
[winBlockDF setObject:NSStringFromCGPoint(winBlock.center) forKey:@"winBlockPosition"]; 
[winBlockDF synchronize]; 

NSString *trackName = [[alertView textFieldAtIndex:0] text]; 
trackTitle.text = trackName; 

[trackArray addObject:[NSString stringWithFormat:trackName,[trackArray count]+1]]; 
[self.myTableView reloadData]; 

然後我的tableView didSelectRowAtIndexPath:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
CGPoint ballPoint = CGPointFromString([userDefaults objectForKey:@"ballPosition"]); 
[ball setCenter:ballPoint]; 

NSUserDefaults *block1DF = [NSUserDefaults standardUserDefaults]; 
CGPoint block1Point = CGPointFromString([block1DF objectForKey:@"block1Position"]); 
[block1 setCenter:block1Point]; 

NSUserDefaults *block2DF = [NSUserDefaults standardUserDefaults]; 
CGPoint block2Point = CGPointFromString([block2DF objectForKey:@"block2Position"]); 
[block2 setCenter:block2Point]; 

NSUserDefaults *block3DF = [NSUserDefaults standardUserDefaults]; 
CGPoint block3Point = CGPointFromString([block3DF objectForKey:@"block3Position"]); 
[block3 setCenter:block3Point]; 

NSUserDefaults *winBlockDF = [NSUserDefaults standardUserDefaults]; 
CGPoint winBlockPoint = CGPointFromString([winBlockDF objectForKey:@"winBlockPosition"]); 
[winBlock setCenter:winBlockPoint]; 
+0

我有一個更好的問題,我們如何才能解決您的問題,而無需看到源代碼?請張貼相關的代碼,以便我們可以檢查它,也許發現問題;) – danypata

+0

保留代碼片段的問題,而不是評論。 – WrightsCS

+1

這段代碼太可怕了。 1.)除非立即需要這些值,否則不需要調用「synchronize」。 2)你不需要爲你試圖存儲的每個值創建一個新的/獨立的'NSUserDefaults'實例。你的代碼基本上可以簡化爲:http://pastie.org/8104985 – WrightsCS

回答

1

的原因,你只能保存數據的一個副本是不是因爲你是一個bug。因爲NSUserDefaults只能保存一個版本的「ballPosition」。任何時候你保存另一個「ballPosition」它將會取代你現有的「ballPosition」。

我建議不要使用NSUserDefaults。一般來說,當你想要保存許多類似數據的版本時,你想使用核心數據。

一個很好的教程在這裏http://www.raywenderlich.com/934/core-data-on-ios-5-tutorial-getting-started但如果你想在這裏簡要概述是:

如果您在Xcode中創建一個新的項目,選擇主從應用程序,並選擇使用的核心數據,你將有一個新的核心數據支持的應用。

此演示應用程序創建一個「Event」對象表,每個對象都有一個名爲「timestamp」的屬性。

每次你打的添加按鈕下面的代碼運行:

- (void)insertNewObject:(id)sender 
{ 
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; 
    NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity]; 
    NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; 

    // If appropriate, configure the new managed object. 
    // Normally you should use accessor methods, but using KVC here avoids the need to add a custom class to the template. 
    [newManagedObject setValue:[NSDate date] forKey:@"timeStamp"]; 

    // Save the context. 
    NSError *error = nil; 
    if (![context save:&error]) { 
     // Replace this implementation with code to handle the error appropriately. 
     // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
} 

這將創建一個新的Event對象,設置了關鍵時間戳當前的日期,並保存對象到本地數據庫。

這裏的一個巨大優勢是,您現在可以完美地使用MVC或Modal View Controller體系結構模式。你有一個獨立於你的視圖和控制器的完整模式(和數據庫)層。

你也正確地使用UITableViews,你有一個NSFetchedResultsController,它可以隨時保持你的表是最新的,並且你有一個單獨的詳細視圖來顯示錶中的項目。

有幾件事情要記住與核心數據:

  1. 你必須爲你的數據庫的模式。您可以從Xcode中的xcdatamodeld文件編輯模式。您在模型中存儲的任何內容都必須在此處定義。
  2. 如果你只是搞亂你可以重新安裝你的應用程序,每當你改變你的xcdatamodel,它會正常工作,否則你需要處理遷移和你的架構的不同版本。
  3. 核心數據並不是最容易學習的工具,但是一旦學習了它,創建應用程序時就會有更好的起點。
+0

我很欣賞這一點,但我不想重新啓動整個項目。有沒有在單視圖應用程序中實現這一點的方法?我已經導入了CoreData框架 – Chase

+0

你當然可以,我鏈接的教程有一些步驟。基本上你需要添加一個xcdatamodald文件,創建一個NSFetchedResults控制器等。我只需從你創建的新項目中導入代碼。 –