Как разделить значения между двумя экземплярами View Controller? - PullRequest
0 голосов
/ 22 ноября 2010

У меня есть View Controller, который инициализирует UIView в качестве своего вида. Это представление инициализирует другой UIView как подпредставление. Оба UIViews связываются с View Controller через делегат / протокол.

Каждый UIView создает экземпляр ViewController и делает его равным делегату:

ViewController *aDelegate = [[ViewController alloc] init];
self.delegate = aDelegate;

ПРОБЛЕМА. В View Controller есть переменная (int) selection, которая модифицируется обоими UIViews. Оба представления должны знать, как друг друга изменили переменную, но, поскольку у каждого есть свой экземпляр View Controller, обмен данными невозможен. Как бы я решил эту проблему?

Спасибо за тонну

РЕДАКТИРОВАТЬ: Питер упомянул назначение делегата при создании представлений, которое мне нравится, но как бы я это сделал для подпредставления, поскольку оно создается в UIView, а не в View Controller. PS. На самом деле это подпредставление подпредставления подпредставления, поэтому я могу создать их все в View Controller, а затем назначить его в качестве делегата?

Попытка назначить делегата следующим образом, но он постоянно падает, когда я пытаюсь вызвать метод ViewController из представления:

MyView *mainView = [[MyView alloc] initWithFrame:frame];
self.view = mainView;
mainView.delegate = self;
[mainView release];

Ответы [ 2 ]

0 голосов
/ 22 ноября 2010

Представления не должны знать друг о друге.В вашем контроллере представления вы определяете свойство для вложенного представления

@property (nonatomic, retain) MyView *myView;

Затем вы создаете вспомогательное представление и назначаете делегата.Это можно сделать в viewDidLoad

- (void)viewDidLoad {
    [super viewDidLoad];

    CGRect frame = ...;
    MyView *subView = [[MyView alloc] initWithFrame:frame];
    self.myView = subView;
    subView.delegate = self;
    [self.view addSubView:subView];
    [subView release];


    self.view.delegate = self;
} 

Затем в вашем методе делегата, который я только что догадался, как он может выглядеть, вы можете обновить контроллер представления так же, как и другое представление.

- (void)view:(MyView *)view didUpdateSelection:(int)newSelection {
    self.selection = newSelection;
    if (view == self.view) {
        self.myView.selection = newSelection;
    }
    else {
        self.view.selection = newSelection;
    }
} 
0 голосов
/ 22 ноября 2010

Похоже, что вместо каждого представления, выделяющего отдельный экземпляр контроллера представления, необходимо назначить экземпляр контроллера представления, который создал представления, в качестве делегата каждого представления.

Один способ подходаэто означает, что контроллер представления назначает себя в качестве делегата представления при создании представления.

...