2010-01-27 6 views
1

코드를 [tableView reloadData]를 실행하고 싶습니다. 별도의 클래스에서 데이터를 다시로드하려는 뷰 컨트롤러로 호출하고 싶습니다.아이폰 SDK를 - 별도의 클래스에서 테이블 뷰 데이터를 다시로드

(참고. reloadData보다 tableview를 다시로드하는 것이 더 효과적이면 chime).

내가 다시로드하려는보기가 'RootViewController'라고 말하면 현재 'DetailViewController'에 있습니다. 작동하도록하려면 어떻게해야합니까?

내 최선의 시도는 지금 [RootViewController.tableView reloadData]이지만 올바르지 않습니다. ... ':'예상 : 는 (나는 오류가 DetailViewController의 속성을 선언 당신은 DetailViewController에 RootViewController 인스턴스에 대한 참조를 필요

답변

9

알림 또는 프로토콜을 사용할 수 있습니다.

사용 통지 :

후 알림 바로 데이터를 저장 마친 후 및 방법에서 반환하기 전에. 다음과 같은 것 :

// 게시 알림 [[NSNotificationCenter defaultCenter] postNotificationName : @ "DataSaved"object : nil]; 마지막으로

[[NSNotificationCenter defaultCenter] addObserver:self 
                                selector:@selector(dataSaved:) 
                                                 name:@"DataSaved" object:nil]; 

를, 등록을 취소

를 첨가의 dealloc 방법에 : 테이블을 처리하는 컨트롤러에서

,

- (void) dataSaved:(NSNotification *)notification{ 

    [self.tableView reloadData]; 

} 

viewDidLoad 방법은 알림을 등록하려면 다음 코드를 추가로 구현

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

프로토콜 사용 :

이전 컨트롤러에서 사용할 수있는 콜백 프로토콜을 만들기 시작하십시오.

@protocol dataSavedDelegate 
-(void)dataSaved; 
@end 

당신이 당신의 데이터를 저장 완료 후 : 당신이 당신의 테이블을 다시로드 dataSaved() 방법 :

[(id<dataSavedDelegate>)object dataSaved]; 

지금, 이전 컨트롤러에는 대리자 메서드를 처리합니다.

1

@norskben,

감사 토큰 전에 당신은에서 (당신의 DetailViewController를 인스턴스화 할 때

[self.rootController.tableView reloadData]; 
다음 RootViewController, 나는 가정), 그런 다음 세부 컨트롤러에서 루트 컨트롤러에 액세스 할 수 있습니다

// in RootViewController.m 
detailController.rootController = self; 
[self.navigationController pushViewController:... 

같은으로 설정

또 다른 방법은 RootController를 다시로드하고 RootController에서 알림을 수신하도록하려는 경우 DetailViewController에 사용자 지정 NSNotification을 게시하는 것입니다.

또 다른 방법은 사용자가 루트 컨트롤러로 돌아갈 때만 테이블을 다시로드하는 것입니다 (RootViewController의 viewWillAppear : 메소드에서 수행). 이유는 화면에없는 테이블을 다시로드하는 것입니다.