-1

사용자가 모달 방식으로 다른보기 컨트롤러로 이동하고 텍스트 필드에 텍스트를 추가하는 데는 테이블보기와 더하기 단추로 구성된 간단한 응용 프로그램이 있습니다. 그것을 구하기 위해.표보기를 사용하여 핵심 데이터 내부에서 단일 속성을 편집하는 올바른 방법

백 엔드에 저장한다는 것은 코어 데이터에 저장하는 것을 의미하며 NSFetchedResultsController를 사용하여 테이블보기 컨트롤러에 표시합니다.

모델은 다음과 같습니다 사람의 이름 속성이 whoFrom.name을 것 행사 엔티티 사람 엔티티 트랜잭션 엔티티는 다른 엔티티들에 대한 관계가

, 그래서

거래 엔티티 날짜 엔티티.

새로운 항목을 추가하면 모든 것이 잘 작동하지만 편집하는 데는 어려움이 있습니다. 셀을 클릭하고 prepareForSegue를 통해 뷰 컨트롤러의 정보를 가져옵니다. 이름 텍스트 필드에는 입력 한 이름이 있으며 이벤트 텍스트 필드에는 입력 한 이름이 있습니다.

이 부분을 깨끗하게 편집하고 싶습니다.

그래서 사용자가 이름 텍스트 필드를 잭에서 빌로 변경하면 모든 잭을 청구서로 변경하지 않고이 셀만 변경하려고합니다.

그래서 다음과 같은 논리를 준수해야합니다 : 빌에 잭에서

  • 이름 변경
    • 빌이 존재하는 경우, 그것을 돌려 빌의 거래로이 거래를 추가
    • 빌이 존재하지 않는 경우 , 그것을 창조하십시오.
    • Jack이 하나의 트랜잭션 만 갖고 Jack을 Bill으로 이름을 바꾸면 Core Data에서 "Jack"을 제거하십시오. 이 새 항목을 저장 할 때

나는 1과 2에 이미에 코드가 있습니다. 내가 자습서를 읽고 내 편집 뷰 컨트롤러의 "저장"방법이 작업을 수행하는 방법에 대해 생각되었다

+ (Person *)personWithName:(NSString *)name inManagedObjectContext:(NSManagedObjectContext *)context 
{ 
    Person *person = nil; 

    // Creating a fetch request to check whether the name of the person already exists 
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"]; 
    request.predicate = [NSPredicate predicateWithFormat:@"name = %@", name]; 
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; 
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

    NSError *error = nil; 
    NSArray *people = [context executeFetchRequest:request error:&error]; 
    if (!people) 
    { 
     // Handle Error 
    } 
    else if (![people count]) 
    { 
     // If the person count is 0 then let's create it 
     person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context]; 
     person.name = name; 
    } 
    else 
    { 
     // If the object exists, just return the last object . 
     person = [people lastObject]; 
    } 
    return person; 
} 

, 또는 세부 사항 :

NSManagedObjectContext *context = [self managedObjectContext]; 
Transaction *transaction = [NSEntityDescription insertNewObjectForEntityForName:@"Transaction" inManagedObjectContext:context]; 

Person *enteredPerson = (Person *)[Person personWithName:self.nameTextField.text inManagedObjectContext:context]; 
transaction.whoBy = enteredPerson; 

personWithName는 사람 NSManagedObjectSubclass의 카테고리입니다 일반적으로 호출되는 컨트롤러를 볼 수 있지만이 작업을 수행하는 방법을 파악할 수는 없습니다.

편집 할 때 새 트랜잭션을 만들지 않고 그 트랜잭션에 대한 정보를 얻고 이름이나 이벤트를 변경 한 다음 다시 저장하고 싶습니다. 그래서 DetailViewController의 save 메소드에 insertNewObject를 넣을 수는 없을 것입니다.

newName과 oldName을 지정합니까? transaction.whoBy 등을 업데이트합니까?

나는이 책을 정말 잃어 버렸기 때문에 올바른 방향으로 나아가는 것이 대단히 도움이 될 것입니다. 나는 새로운 엔트리를 추가하기위한 위의 save 메소드가 이미 존재한다면 사용자를 리턴하거나 그가 존재하지 않는다면 성공적으로 리턴하는 로직을 성공적으로 수행하기 때문에 내가 닫았다는 것을 안다.

감사합니다.

답변

1

실제로 매우 간단합니다. 사용자 인스턴스가 존재하거나 존재하지 않습니다. 그렇다면 사용자에게 편집 할 사람을 선택할 수있는 목록을 제시하십시오. 새 사용자 인 경우 사용자가 명시 적으로 새 사용자를 만들도록 허용합니다.

사용자가 이미 존재하는 이름으로 새 사람을 만들려고하면 사용자에게 수행 할 것을 요청하십시오.

보기 컨트롤러 관점에서 보면 쉽습니다. 동일한 컨트롤러를 편집 및 생성에 사용할 수 있습니다. 유형을 Person으로 지정하고 이름과 같은 속성 만 변경하면됩니다. 그것이 편집 인 경우 선택한 사람을 지정하고, 지정하지 않은 경우 선택하고 할당하십시오. 새 항목이고 사용자가 취소 한 경우 해당 항목을 삭제하십시오.

+0

고마워요. @Mundi - 많은 의미가 있습니다. 기본적으로 작동하고 있습니다. 다른 질문이 맞는지 잘 모르겠지만 (기꺼이 요청할 것입니다.) 탭 기반입니다. 전적으로 "이름"을 표시하는 "Person"에 대한 것입니다. 첫 번째 테이블보기에서 셀을 편집 할 때 (질문 당) 셀은 잘 작동하지만 한 항목 만 있으면 이전 사용자 이름을 제거하지 않습니다. 그래서 예를 들어 .. 존은 하나의 엔트리를 가지고있다. 나는 John을 Bill으로 이름을 바꾼다. 거기서 모든 정보를 가지고 Bill을 잘 만들지 만 John도 유지한다.이 단계에서 John은 이제 삭제되어야한다. ! – amitsbajaj

+0

또는 아마도 삭제 된 것은 올바른 단어는 아니지만 John이 거래를하지 않는 경우 이름 목록에 나타나서는 안됩니다. – amitsbajaj

+0

이름 컨트롤러는 상용구 콜백 구현을 사용하여 NSFetchedResultsControllerDelegate를 구현해야합니다. John은 Bill이 "자동으로"됩니다. – Mundi

관련 문제