2013-07-02 5 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

이유 당신은 단지 당신이 버그를 가지고 있기 때문에 데이터의 사본이 아닌 저장할 수 있습니다 : 여기 내 저장 기능입니다. 왜냐하면 NSUserDefaults는 "ballPosition"의 한 버전 만 저장할 수 있기 때문입니다. 언제든지 다른 "ballPosition"을 저장하면 기존 "ballPosition"이 대체됩니다.

나는 NSUserDefaults를 전혀 사용하지 말 것을 제안합니다. 일반적으로 유사한 데이터의 많은 버전을 저장하려면 코어 데이터를 사용하십시오.

좋은 자습서는 여기 http://www.raywenderlich.com/934/core-data-on-ios-5-tutorial-getting-started입니다하지만 당신이 여기 빠른 개요를 원하는 경우는 다음과 같습니다 당신이 엑스 코드에서 새 프로젝트를 만들 경우, 마스터 - 세부 응용 프로그램을 선택하고 사용 코어 데이터를 선택

새로운 코어를해야합니다 데이터 기반 애플리케이션.

이 데모 응용 프로그램은 각각 "타임 스탬프"라는 속성이있는 "이벤트"개체의 테이블을 만듭니다.

때마다 다음 코드가 실행되는 추가 버튼을 누르면 :

- (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(); 
    } 
} 

이것은, 새로운 이벤트 객체를 생성 키 타임 스탬프 현재 날짜를 설정하고 로컬 데이터베이스에 객체를 저장합니다.

여기서 큰 이점은 MVC 또는 모달 뷰 컨트롤러 아키텍처 패턴을 완벽하게 사용하고 있다는 것입니다. 뷰와 컨트롤러에서 독립적으로 작동하는 모달 (및 데이터베이스) 레이어가 있습니다.

당신은 또한 UITableViews를 올바르게 사용하고 있습니다. NSFetchedResultsController를 사용하면 언제든지 테이블을 최신 상태로 유지할 수 있으며 테이블에 항목을 표시하는 별도의 세부 정보보기가 있습니다. 코어 데이터와 함께 염두에 두어야

몇 가지 :

  1. 당신은 당신의 데이터베이스에 대한 스키마를 가지고있다. Xcode의 xcdatamodeld 파일에서 스키마를 편집 할 수 있습니다. 모델에 저장하는 항목은 여기에 정의해야합니다.
  2. xcdatamodel을 변경할 때마다 응용 프로그램을 다시 설치할 수 있으며 정상적으로 작동합니다. 그렇지 않으면 마이그레이션 및 다른 버전의 스키마를 처리해야합니다.
  3. 코어 데이터는 학습하기 가장 쉬운 도구는 아니지만 일단 학습하면 앱을 만들 때 훨씬 더 좋은 출발점을 갖게됩니다.
+0

정말 고맙겠지 만 전체 프로젝트 전체를 다시 시작하고 싶지는 않습니다. 단일 뷰 응용 프로그램에서이를 구현할 수있는 방법이 있습니까? 이미 CoreData 프레임 워크를 가져 왔습니다. – Chase

+0

확실히 할 수있는 링크 된 자습서에는 이에 대한 몇 가지 단계가 있습니다. 기본적으로 xcdatamodald 파일을 추가하고, NSFetchedResults 컨트롤러를 생성해야합니다. 생성 한 새 프로젝트에서 코드를 가져옵니다. –

관련 문제