2012-03-04 2 views
0

в PrimaryViewController.h У меня есть IBOutlet прикрепленный к столу я добавил в файл .xibИспользование pushViewController на отдельном табличном делегата

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 с no .xib-файл.

ответ

0

Вы можете импортировать заголовок 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 «s путем доступа к этому свойству:

[self.viewController pushViewController:newViewController]; 
+0

Спасибо Josh, Я только что попытался это сделать, и у меня все еще есть некоторые проблемы. Разве нет другого способа сделать то, что я пытаюсь сделать i.e использовать pushViewController из другого класса? Это должно быть что-то, что было сделано до того, как я подумаю. – hishamaus

+0

Чрезвычайно сложно сказать, если у вас нет дополнительной информации в вашем вопросе. Какие именно проблемы? Основная проблема, которую я вижу, заключается в следующем: как ваш «TableDataController» получает ссылку на контроллер представления в первую очередь? Где он создан? В xib или в коде? Можете ли вы изменить свой вопрос, чтобы включить здесь немного больше о структуре? –

+0

Я только что редактировал вопрос. Спасибо за вашу помощь. – hishamaus

Смежные вопросы