Как получить доступ к данным из ViewController в подпредставлении? - PullRequest
2 голосов
/ 25 января 2011

У меня есть viewcontroller, который содержит переменную экземпляра, содержащую объект словаря с кучей данных.Представление довольно сложное и содержит несколько подпредставлений, которые я создаю и внедряю из отдельных файлов представлений (чтобы не иметь тысячи строк кода пользовательского интерфейса в реальном контроллере представления) - но как эти подпредставления, которые существуют в их собственных файлах, получают доступмой словарь объекта из viewcontroller?Поэтому, когда я редактирую файл DescriptionView.m - Как получить доступ к содержимому объекта словаря locationData из 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];
}

Ответы [ 2 ]

5 голосов
/ 25 января 2011

В идеале вы никогда не должны получать доступ к каким-либо свойствам 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. E.g.:

DescriptionView.m:

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

Если вам нужно выполнить некоторые действия при нажатии какой-либо кнопки в DescriptionView (или при любом другом взаимодействии с пользователем), хорошей идеей было бы объявить протокол, подобный DescriptionViewDelegate (или что-то в этом роде):

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

затем сделайте ваш CaseViewController делегатом и реализуйте там эти методы.

1 голос
/ 25 января 2011

Самый простой способ получить ссылку на свой контроллер вида из представления - это расширить UIView:

@interface MyView: UIView {
    UIViewController *mViewController;
}

Затем в loadView

MyView *view = [[MyView alloc] init];
view.mViewController = self;
...