2011-01-25 6 views
2

데이터 집합과 함께 사전 개체를 포함하는 인스턴스 변수를 포함하는 viewcontroller가 있습니다. 뷰는 상당히 복잡하며 별도의 뷰 파일에서 인스턴스화하고 포함하는 몇 가지 하위 뷰가 포함되어 있습니다 (실제 뷰 컨트롤러에 수천 줄의 UI 코드가 없게하려면).하지만 자신의 파일에있는이 서브 뷰는 어떻게 액세스 할 수 있습니까? viewcontroller에서 내 사전 개체? 그래서 내가 imviewView.m 파일을 편집 할 때 - ViewController에서 locationData 사전 객체의 내용에 어떻게 접근합니까?하위 뷰에서 ViewController의 데이터에 액세스하는 방법은 무엇입니까?

당신이 무슨 뜻인지 이해하길 바랍니다.

CaseViewController.h 뷰가있다로부터의 ViewController에 대한 참조를 가지고

#import "DescriptionView.h" 

@interface CaseViewController : UIViewController { 
    NSDictionary *locationData; 

    DescriptionView *descriptionView; 
} 

@property (nonatomic, retain) NSDictionary *locationData; 
@property (nonatomic, retain) DescriptionView *descriptionView; 

@end 

CaseViewController.m

- (void)loadView { 
    UIView *view = [[UIView alloc] init]; 

    descriptionView = [[DescriptionView alloc] initWithFrame:CGRectMake(0, 130, 320, 237)]; 
    descriptionView.hidden = NO; 

    [view addSubview:descriptionView]; 

    self.view = view; 
    [view release]; 
} 

답변

5

에 이상적으로 당신은보기에서의 ViewController의 속성에 액세스해서는 안됩니다. MVC 아키텍처의 주된 아이디어는 viewcontroller가 렌더링 할 내용을 보여 주며 그 반대의 경우가 아니라는 것입니다. 동적보기를 업데이트해야하는 경우

- (void)loadView { 
    UIView *view = [[UIView alloc] init]; 

    descriptionView = [[DescriptionView alloc] initWithFrame:CGRectMake(0, 130, 320, 237) paramDict: self.locationData]; descriptionView.hidden = NO; 

    [view addSubview:descriptionView]; 

    [descriptionView release]; // BTW add this line here (or in dealloc) or you'll have a leak 

    self.view = view; [view release]; 
} 

, 당신이보기에 몇 가지 방법을 추가하고 viewcolnroller에서 호출해야합니다 그래서 당신은보기가 초기화 년대 렌더링에 필요한 모든 데이터를 제공해야 . 예 :

DescriptionView.m : 당신은 몇 가지 작업을 수행해야하는 경우

-(void) updateWithDict:(NSDictionary*) udict; 

이 DescriptionView의 일부 버튼은 좋은 생각이 DescriptionViewDelegate 같은 프로토콜 (선언 될 누르면 (또는 다른 사용자 상호 작용)한다 나)처럼 매끄러운 :

-(void) descriptionViewButton1Pressed:(DescriptionView*) dview; 
-(void) descriptionViewButton2Pressed:(DescriptionView*) dview; 

은 다음 CaseViewController 위임하고 그 방법이 구현합니다.

+1

굉장하다 - 고마워 - 너는보기에 논리를 움직이지 않는 것에 대해 절대적으로 맞다. :) – Milk78

1

simpliest 방법 : 여기

은의 ViewController에서 미리보기입니다 연장 UIView :

@interface MyView: UIView { 
    UIViewController *mViewController; 
} 

그런 loadView

MyView *view = [[MyView alloc] init]; 
view.mViewController = self; 
관련 문제