Используйте pushViewController для отдельного делегата таблицы - PullRequest
0 голосов
/ 05 марта 2012

в PrimaryViewController.h У меня есть IBOutlet, прикрепленный к таблице, которую я добавил в .xib-файле

IBOutlet UITableView *table;

в PrimaryViewController.m Я создаю новый tableController из моегоКласс TableDataController и присоединение его к таблице

tableController = [[TableDataController alloc] initWithStyle:UITableViewStylePlain];
//Attach the table controller as datasource and delegate to the table
[table setDelegate:tableController];
[table setDataSource:tableController];

Теперь все данные в таблице поступают из tableController.Поскольку PrimaryViewController является классом, который помещается в стек навигационного контроллера, а не в класс TableDataController;использование:

[self.navigationController pushViewController:newViewController];

в tableController ничего не дает, так как tableController не имеет navigationController . PrimaryViewController может использовать navigationController .

. Я хочу использовать функцию didSelectRowAtIndexPath: в TableDataController, чтобы выдвинуть новое представлениеконтроллер в стек PrimaryViewController.

Обратите внимание: я не могу #import "ParimaryViewController.h" в свой TableDataController.h, поэтому я могу отправить его ( PrimaryViewController ) объект - тогда они будут перекрестноимпортируя друг друга, создавая семантическую ошибку.

PrimaryViewController - это обычный класс, который расширяет класс UIViewController с помощью .xib ничего особенного.TableDataController - это обычный класс, который расширяет класс UITableViewController с помощью нет .xib файла.

1 Ответ

0 голосов
/ 05 марта 2012

Вы можете импортировать заголовок PrimaryViewController в TableDataController. m , чтобы избежать цикла импорта.

Ваш TableDataController просто нуждается в ссылке на PrimaryViewController. Все, что вам нужно сделать, это добавить свойство к TableDataController и установить его сразу после создания контроллера данных.

@property (assign, nonatomic) PrimaryViewController * viewController;

Чтобы иметь возможность использовать это имя класса, вам нужно добавить прямое объявление прямо под импортом в TableDataController.h:

@class PrimaryViewController;

Это позволяет компилятору знать, что такой класс существует, и вы будете ссылаться на него в этом заголовочном файле, но он будет определен в другом месте.

Синтезируйте собственность как обычно. Когда вы создаете TableDataController, вы устанавливаете это свойство так, чтобы оно указывало на создание контроллера представления:

tableController = [[TableDataController alloc] initWithStyle:UITableViewStylePlain];
[tableController setViewController:self];

Теперь вы можете отправить сообщение контролеру в методах TableDataController, обратившись к этому свойству:

[self.viewController pushViewController:newViewController];
...