1

코어 데이터와 행 구성에 데이터를 저장할 때 몇 가지 문제가 있습니다. 내 문제가 무엇인지 더 잘 이해하기 위해 내가 가지고있는 것을 설명 할 것입니다 :코어 데이터 행 삽입 및 문제 저장

메인 테이블 뷰가 동적 테이블과 함께 작동합니다.이 테이블 뷰에는 + 버튼이 있고, + 버튼을 누를 때마다 tableview가 popover 내에 나타납니다. 사용자가 메인 셀에 삽입 할 "셀 유형"을 선택할 수 있습니다. tableview. "셀 유형"은 맞춤 셀이며 하나의 클래스 및 xib 파일입니다. 각 사용자 정의 셀에는 다양한 텍스트 필드가 있습니다. 따라서 아이디어는 다음과 같습니다.

  1. 셀 유형을 선택하고 주 테이블 뷰에 삽입하십시오.
  2. 텍스트 필드에 데이터를 입력하십시오.
  3. 저장된 데이터는 삽입 된 행 수와 텍스트 필드의 데이터에 해당합니다.

팝 오버의의 tableview를 호출 할 때 난 내 주요의 tableview에서이 방법이 있습니다

- (IBAction)Add:(id)sender { SelectProduct *typeProduct=[[self.storyboard instantiateViewControllerWithIdentifier:@"selectTable"]initWithTableViewTag:self.tableView.tag]; self.popover=[[UIPopoverController alloc]initWithContentViewController:typeProduct]; [popover presentPopoverFromBarButtonItem:buttonAdd permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; typeProduct.popView = self.popover; typeProduct.cellSelected = self.cellSelected; //cellSelected is core data subclass. typeProduct.delegate = self; typeProduct.managedObjectContext = self.managedObjectContext; } 

다음 내 팝 오버에있는 tableview의 내 didSelectRow에, 내가 가진 :

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
row = indexPath.row; 

if (row == 0) 
{ 
    cellSelected=[NSEntityDescription insertNewObjectForEntityForName:@"CellSave" inManagedObjectContext:self.managedObjectContext]; 
    cellSelected.nameCellData = @"Olive"; 
    cellSelected.amountData = myCostumCell.amount.text; 
} 

여기에서 세포가 내 주요 tableview에 삽입됩니다, 여기 내 주요 tableview 관련 방법 :

- (void)viewDidLoad 
{ 
[self.tableView registerNib:[UINib nibWithNibName:@"myCostumCellXib" bundle:nil] forCellReuseIdentifier:@"myCostumCell"]; 

AppDelegate *appDelegate =[[UIApplication sharedApplication] delegate]; 
self.managedObjectContext=[appDelegate managedObjectContext]; 

NSError *error = nil; 
if (![self.fetchedResultsController performFetch:&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(); 
} 

[self fetchedResultsController]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

{ 
static NSString *CellIdentifier = @"myCostumCell"; 

cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
cell.cellSelected = self.cellSelected; 
cell.managedObjectContext = self.managedObjectContext; 

if (cell == nil) 
{ 
    cell = [[MyCostumCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 
cellSelected = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
cell.nameCell.text = cellSelected.nameCellData; 

if ([cellSelected.nameCellData isEqualToString:@"Olive"]) 
    { 
    cell.amount.text = cellSelected.amountData; 
    // i have more textfields to assign but i think you understand the rest.. 
    } 
} 

내 fetchedResultsController 방법 : 내가 메인의 tableview를 종료하고 내가 이해, 다른있는 tableview로 이동하려면 지금

- (NSFetchedResultsController *)fetchedResultsController 
{ 

if (_fetchedResultsController != nil) 
{ 
    return _fetchedResultsController; 
} 

// Create and configure a fetch request. 
NSFetchRequest *fetchRequestCellSave = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entityCellSave= 
[NSEntityDescription entityForName:@"CellSave" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequestCellSave setEntity:entityCellSave]; 

// Create the sort descriptors array. 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"nameCellData" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[fetchRequestCellSave setSortDescriptors:sortDescriptors]; 

_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequestCellSave managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"nameCellData" cacheName:nil]; 
_fetchedResultsController.delegate = self; 
self.fetchedResultsController = _fetchedResultsController; 

return _fetchedResultsController; 


} 

를 (또한 다른 사람을 가지고 있지만 그들은 표준 물건입니다) 내 managedObject에 텍스트 필드의 내용을 저장해야합니다.

- (void)viewWillDisappear:(BOOL)animated 
{ 
[super viewWillDisappear:animated]; 

    cellSelected.amountData = cell.amount.text; 

    //i have more textfields to assign but for the example i think you understand 
     what i want. 

    [self.managedObjectContext save:nil]; 

} 

여기에서 한 행은 "sa VED "또한 양의 텍스트 ...하지만 문제는 내가 한 번 더 행을 추가 할 때 시작 :

새 행 대신 이전 행이 삽입 후에의의의 tableview의 상단에 나타납니다 왜
  1. ?

  2. 두 번째 행의 textField (amount)를 채울 때 ... tableview를 종료하고 돌아 오면 텍스트 필드가 채워진 것처럼 보이지 않습니다. 내가 뭘 잘못하고 있습니까? 내가 ... 하나를 삽입의 tableview를 종료 한 후 다시 와서 다른 행을 삽입 할 경우

  3. 이전 문제는 ... 텍스트 필드의 양이 ... 저장됩니다 내가 한 번에 두 행을 삽입하면 어떻게하지만

내 문제는 어디에 있습니까? 내 맞춤 셀 클래스에 있나요? 어디서? ... 긴 게시물에 대해 유감이지만, 이것은 나를 미치게 만든다.시간에 대한

감사

감사

답변

1

당신은이 뷰가 디스플레이에서 제거되지 바로 그 때, 입력되는 즉시 데이터를 저장해야합니다. 셀이 화면 밖으로 스크롤 되 자마자 재사용되거나 죽기 때문에 텍스트가 저장되기 전에 저장해야합니다. 텍스트가 변경되면 텍스트 필드 델리게이트 콜백에 가장 적합합니다.

저장하기 전에 2 개의 행을 추가하면 내부 상태가 손상됩니다 (두 번째 행이 추가되었지만 첫 번째 행의 데이터를 아직 저장하지 않은 경우).

행이 입력 된 텍스트별로 정렬되므로 텍스트가 화면에 표시되는 위치를 결정할 때 텍스트에 따라 정렬됩니다.

MVC가 아닌 관리 대상 컨텍스트에 대한 참조를 셀에 제공해서는 안됩니다.

코드가 그들을 혼란스럽게 보인다 또한 지역 및 인스턴스 변수의 차이에 대해 생각해야 ...

+0

안녕하세요 북두칠성, 첫째 날, 정말 미안 내 게시물에 응답 해 주셔서 감사하자 lost.So 당신이 말할 때 : "입력하자마자 데이터를 저장해야합니다"라고 말하면 텍스트입니까? 그래서 내 costum 셀 클래스의 textfieldDidEndEditing 메서드로 이동해야합니까? 또한 행을 삽입 할 때 저장해야합니까?. 또한 핵심 데이터와 함께 일하고있는 또 다른 tableview가 있고 데이터를 삽입하고 싶을 때 + 버튼을 누르고 모달 tableview (정적 셀)이 나타나면 텍스트를 삽입하고 올바르게 저장하지만 동적 표준을 사용하고 있습니다. 행과 모든 행은 항상 서로 아래로 이동합니다. – Japa

+1

안녕하세요. 예, -textFieldDidEndEditing 또는 -shouldChangeCharactersInRange 대리자 메서드가 작동합니다. 행을 삽입 할 때 저장하는 것은 당신에게 달린 것입니다. 새 엔티티를 삽입하지만 유효하게 클래스를 만드십니까? 그렇게하면 저장하십시오. 텍스트가있을 때까지 유효하지 않으면 그때까지 저장하지 마십시오. – Wain

+1

테이블의 행 순서는 반입 된 결과 컨트롤러에 제공된 정렬 설명 자에 의해 결정됩니다. – Wain

관련 문제