2013-03-17 2 views
2

보기 컨트롤러 (보기 컨트롤러 1)에서 핵심 데이터를 사용하는 테이블 뷰의 데이터를 새로 고치려고합니다. 값을 핵심 데이터로 저장하는 데 사용되는 저장 버튼 (UIButton)은 다른보기 컨트롤러 (보기 컨트롤러 2)에 있습니다.다른 클래스의 핵심 데이터 테이블 뷰 다시로드

이들은 모두 iPad의 동일한 화면에 동시에 있지만 컨테이너보기를 사용하여 별도의 클래스 (헤더 및 기본 파일)를 가지고 있습니다. 보기 컨트롤러 1에서 저장 단추를 클릭하면보기 컨트롤러 2에있는 테이블보기가 새로 고쳐지지 않습니다.

그러나 핵심 데이터로 데이터를 저장하는 방식이 아니라는 것을 알고 있습니다. 응용 프로그램을 새로 고치면 새 셀이 예상 한 것처럼 테이블보기에서 팝업됩니다. 나는 행운과 새로 테이블보기를 시도하고 얻을 수있는 다음과 같은 방법을 시도 :

// ViewController1.m (Save Button) 

- (IBAction)saveMethod { 

    //Core Data Save Method Goes Here (Irrelevant) 

    [self.managedObjectContext save:nil]; 

    //ViewController2 has the table view 
    ViewController2 *trackingView = [[ViewController2 alloc] init]; 

    trackingView.managedObjectContext = self.managedObjectContext; 
    [trackingView setupFetchedResultsController]; 
    [trackingView.view setNeedsDisplay]; 
    [trackingView.table reloadData]; 
} 

내가 다른보기 컨트롤러에서 자신을 새로 고치려면이 테이블보기를 이야기하는 방법을 알아낼 수 없습니다.

답변

2

지금하고있는 것처럼 viewcontroller를 다시 만들 필요가 없습니다.

NSManagedObjectContext이 저장 작업을 완료하면 알림을 게시합니다. 이러한 알림을 수신 할 개체를 등록 할 수 있습니다. fetchedResultsController의 대표자를 다시 설정하는 것이 옵션이 아닐 경우 (즉, ViewController1이 이미 위임자로 설정되어 있고 ViewController1이 계속 위임자 역할을하는 것이 합리적이라면)

ViewController2 데이터를 처리하는 관리되는 개체 컨텍스트에 대한 참조가 필요하므로 속성을 만들고 적절하게 설정해야합니다 (@property NSManagedObjectContext *moc).

그런 다음, viewDidLoad에서 할 수 register for notifications :

  1. 을 :이 방법에 대한

    -(void)handleNotification:(NSNotification*)notification { 
        if ([notification.name isEqual:NSManagedObjectContextDidSaveNotification] && [notification.object isEqual:self.moc]) { 
         [self.tableView reloadData]; 
        } 
    } 
    

    몇 노트 :

    [[NSNotificationCenter defaultCenter] addObserver:self 
                 selector:@selector(handleNotification:) 
                  name:NSManagedObjectContextDidSaveNotification 
                  object:self.moc]; 
    

    ViewController2이 방법 handleNotification:을 정의해야합니다 보기 컨트롤러가 닫히면 전화를 걸어야합니다. [[NSNotificationCenter defaultCenter] removeObserver:self]. 알림 센터는 옵저버 (나는 어려운 길을 한 번 찾았습니다)를 유지합니다.

  2. 알림을 등록 할 때 관리 대상 개체 컨텍스트를 항상 포함 시키십시오. 모든 저장 알림에 응답하지 않으려는 경우입니다.
+0

나는 위의 다음을 시도했다. 그것이 작동 했어야하는 것처럼 보였지만 그렇지 않았다. View Controller에있는 경우 다른 속성을 만들어야합니까? 2 managedObjectContext 속성이 이미 있습니다. 왜냐하면 "self.moc"보다는 "self.managedObjectContext"를 추가하여 시도했기 때문에 작동하지 않았습니다. – Zack

+0

다른 속성을 만들 필요가 없으며 실제 이름은 중요하지 않습니다. 두 뷰 컨트롤러 모두에서'managedObjectContext'가 오랫동안 같은 객체를 가리키고 있기 때문입니다. –

+0

그래, 그게 내가 생각한거야. 두 managedObjectContext는 App Delegate를 가리키고 있습니다. – Zack

0

이미 새로 고쳐야하는 인스턴스의 목표 인 경우 ViewController2의 새 인스턴스를 만들고 싶지 않을 것입니다. 실제로 문제는 여기에 있지 않고 ViewController2에 있습니다.

ViewController2이 가져온 결과 컨트롤러의 대리자로 설정되어 있는지 확인한 다음 가져온 결과 컨트롤러 대리자 콜백에서 테이블보기를 업데이트하십시오. 그리고 두보기 컨트롤러가 동일한 관리 대상 컨텍스트를 조사하고 있는지 확인하십시오.

+0

위임자로 설정하여 사용하는 방법을 설명해 주시겠습니까? – Zack

+0

'NSFetchedResultsControllerDelegate'에 대한 문서를 읽었습니까? 여러분이 얻는 콜백과'UITableView'의 업데이트 메소드 사이에는 거의 일대일 매핑이 있습니다. –

관련 문제