2011-01-25 5 views
2

У меня есть viewcontroller, который содержит переменную экземпляра, содержащую объект словаря с кучей данных. Представление довольно сложное и содержит несколько подзаголовков, которые я создаю и внедряю из отдельных файлов вида (чтобы не иметь тысячи строк кода пользовательского интерфейса в реальном диспетчере представлений). Но как эти подзадачи, которые существуют в их собственных файлах, получают доступ к мой объект словаря из viewcontroller? Итак, когда im редактирует файл DescriptionView.m - Как получить доступ к содержимому объекта locationData dictionary из ViewController?Как получить доступ к данным из ViewController в подвью?

Надеюсь, вы понимаете, что я имею в виду.

Вот отрывок из ViewController:

CaseViewController.h

#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

Awesome - Спасибо - Вы абсолютно правы в том, что не двигаете логику к виду :) – Milk78

1

Самый простой способ иметь ссылку на его ViewController с видом является Продление UIView:

@interface MyView: UIView { 
    UIViewController *mViewController; 
} 

Тогда в loadView

MyView *view = [[MyView alloc] init]; 
view.mViewController = self; 
Смежные вопросы