2009-09-18 5 views
1

내 앱에는 사용자가 항상 시작하고 다른보기를 프로그래밍 방식으로 표시하는 기본 화면이 있습니다. "Beginning iPhone Development"Ch.에서 접근 방식과 동일하게 앱을 설정했습니다. 6, 다른보기 컨트롤러에서로드하는 RootViewController를 사용합니다.여러보기 컨트롤러 및 데이터 관리

이 책은 버튼을 사용하여 다음보기 컨트롤러를로드하지만, 응용 프로그램에서는 함수 호출이 끝날 때 컨트롤러를 바꾸고 뷰간에 데이터 (UIImages 처리 등)를 공유해야합니다. 탭 바 또는 탐색 컨트롤러를 사용하지 않습니다.

궁금한 점은, MainViewController를 루트 컨트롤러와 presentModalViewControllers로 만들어야한다는 것입니다. 루트 모델을 유지하고 싶지만 데이터를 모두 연결하고 데이터를 공유하는 방법을 이해하지 못합니다. 프로토콜 및 알림을 사용하여 언급 한 게시물을 보았지만 아직 내 머리를 감쌌습니다. 모든 조언을 부탁드립니다.

답변

1

하위보기 컨트롤러와 공유하려는 개체 인스턴스를 참조하는 기본보기 컨트롤러에 Cocoa property을 추가하면됩니다. 예를 들어

, 우리가 NSArray을 공유하려면, 우리는 메인 뷰 컨트롤러 헤더에있는 그것의 속성을 지정하십시오 @synthesize 지시문을 추가하고 release-dealloc의 배열에 기억 구현에

@interface MainViewController : UIViewController { 
    NSArray *myArray; 
} 

@property (nonatomic, retain) NSArray *myArray; 

@end 

:

@implementation MainViewController 

@synthesize myArray; 

... 

- (void) dealloc { 
    [myArray release]; 
    [super dealloc]; 
} 

@end 

은 또한 동일한 방법으로 기본보기 컨트롤러에 종속 컨트롤러를 보려면이 속성을 추가 할 수 있습니다. 해당 헤더에서 동일한 변수 이름 및 특성 설명을 지정하십시오. 당신이 하위 뷰 컨트롤러를 밀어 준비가되면 메인 뷰 컨트롤러에서

, 그냥 밀어 전에 따라 하위 뷰 컨트롤러의 속성을 설정 : 당신의 하위 뷰 컨트롤러에서 마찬가지로

- (void) pushSubordinateViewController { 
    SubordinateViewController *subVC = [[SubordinateViewController alloc] initWithNibName:@"SubordinateViewController" bundle:nil]; 
    subVC.myArray = self.myArray; // this sets the sub view controller's myArray property 
    [self.navigationController pushViewController:subVC animated:YES]; 
    [subVC release]; 
} 

, 하위 하위 뷰 컨트롤러를 푸시하기 전에 하위 노드의 배열 속성을 적절하게 설정해야합니다.

이러한 방식으로 참조를 설정하면 각 뷰 컨트롤러는 원하는 요소를 포함하는 동일한 배열을 가리키게됩니다.

배열을 사용하려면 self.myArray을 호출하십시오. [self.myArray objectAtIndex:index]을 사용하여 지정된 색인에서 객체를 가져옵니다.

+0

보기 컨트롤러간에 데이터를 공유하는 방법이 정리되어 있습니다. 감사합니다. 내가 아직도 불분명 한 것은 (심지어 애플의 문서를 읽은 후에조차도) 프로토콜의 사용이다. 특히 Xcode "유틸리티 응용 프로그램"템플릿을 사용하여 응용 프로그램을 만드는 경우 다음과 같은 내용이 생깁니다. @protocol FlipsideViewControllerDelegate; @interface FlipsideViewController : UIViewController { \t id delegate; } 이 대리자 변수가 설정된 이유를 알 수 없습니다. flipside보기의 표시/해제에 사용 된 것 같습니다. – Ian

+0

나는 당신이 당신의 게시물에서 언급 한 6 장을 읽지 않았습니다. 그러나 나는 추측을 할 수 있습니다. 대부분의 경우 대리자가 설정되어 FlipsideViewController가 부모 (즉, 부모)를 알릴 수 있습니다.FlipsideViewController에 선행하는 뷰 컨트롤러) – dotnetcoder

관련 문제