Как получить доступ к другому контроллеру / представлению (iOS) - PullRequest
1 голос
/ 27 января 2012

У меня есть три отдельных класса, UIViewController (A) и два UITableViewController (B и C).

Я добавляю таблицы B и C в A.

[A.view addSubview:B.tableView];

[A.view addSubview:C.tableView];

Теперь мне нужно изменить / перезагрузить одну таблицу с помощью выбора в другой таблице.Например, выберите «мясо» в B, затем C - «курица, свинина ...», выберите «фрукты», затем - «яблоко, помидор ...».

Мой вопрос, как правило, Как получить доступ кдругой контроллер / просмотр.Что я должен написать в didSelectRowAtIndexPath в B для доступа к другому контроллеру (A, C)?

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Вы ищете делегирование .Добавьте протокол к B и C, и пусть другой реализует его.

Я написал образец кода довольно давно.

Там CheckTableController может сообщить ShowFavorTableController, поскольку второй реализует протокол делегата первого.

2 голосов
/ 27 января 2012

Обычно я делаю это через NSNotificationCenter. В

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

передать сообщение с помощью NotificationCenter.

[[NSNotificationCenter defaultCenter]postNotificationName:@"NotificationName" object:myObj];

В классе, в котором получающий конец настроен на прослушивание этого уведомления в viewDidLoad или методе init

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadTable:) name:@"NotificationName" object:nil];

Ваш метод объявлен в файле .m

-(void)reloadTable:(NSNotification*)n {
[tableView reloadData];
}

Не забудьте удалить наблюдателя, когда объект уничтожен в методе dealloc Если вы используете ARC

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

Если вы не используете ARC, не забудьте супер

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}
0 голосов
/ 27 января 2012

Я думаю, что лучший способ сделать это, вместо того, чтобы использовать три отдельных контроллера, просто использовать один. Этот контроллер будет подклассом UIViewController, а его файл .h должен выглядеть примерно так:

@interface MyController : UIViewController <UITableViewDataSource, UITableViewDelegate>
    UITableView *firstTableView;
    UITableView *secondTableView;
@end

Теперь в вашем файле .m настройте таблицы следующим образом:

- (id)init {
    if ((self = [super init])) {
        firstTableView = [[UITableView alloc] initWithFrame:/*desired frame*/ style:/*desired style*/];
        secondTableView = [[UITableView alloc] initWithFrame:/*desired frame*/ style:/*desired style*/];

        firstTableView.delegate = self;
        firstTableView.dataSource = self;

        secondTableView.delegate = self;
        secondTableView.dataSource = self;
    }
}

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

Затем реализуйте желаемые UITableViewDataSource методы, например, так:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (tableView == firstTableView) {
        // Do something
    } else if (tableView == secondTableView) {
        // Do something else
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    if (tableView == firstTableView) {
        // Configure the cell
    } else if (tableView == secondTableView) {
        // Configure the cell a different way
    }
}

Наконец, в didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == firstTableView) {
        // Update something that is linked to the return values of secondTableView's dataSource methods
        [secondTableView reloadData];
    }
}

Этот подход гарантирует, что ваш контроллер автоматически получит права -viewDidLoad, -viewWillAppear и так далее. Помните, просто добавление представлений контроллера представления в качестве подпредставлений означает, что ваш контроллер не будет принимать эти вызовы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...