Как ссылаться на навигационный контроллер суперпредставления - PullRequest
1 голос
/ 04 ноября 2010

У меня есть подкласс UITableViewController многократного использования, назовите его «tableVC». Выбор строки таблицы помещает этот детализированный контроллер в стек навигации. Экземпляр tableVC имеет действительный navController только тогда, когда он был выдвинут сам. Пока все хорошо.

Мне нужно встроить представление tableVC в другое представление, viewController которого был перемещен. Так как viewController этого суперпредставления был выдвинут, у него есть действительный navCon. Я не могу получить этот navCon из tableVC, потому что tableVC не был выдвинут, и поэтому совершенно повторно используемый tableVC не может выдвинуть детали. Есть ли чистый способ ссылаться на этот navCon, кроме взлома специальной переменной UINavigationController, и если self.navigationController равен nil, тогда получить доступ к хаку? Похоже, достаточно распространенная ситуация, что должна быть лучшая практика. Любые идеи очень ценятся. -Mike

Ответы [ 2 ]

4 голосов
/ 04 ноября 2010

Краткий ответ AFAIK: нет, другого способа добраться до нужного вам навигационного контроллера нет.

Средний ответ заключается в том, что вы можете переопределить свойство navigationController контроллера табличного представления, чтобы сделать его доступным для записи:

@interface myTableViewController : UITableViewController {
  UINavigationController *navigationController;
}
@property (nonatomic, retain) UINavigationController *navigationController;

Это позволит вам установить его на навигационный контроллер выдвинутого ВК, когда вы добавите его представление в качестве подпредставления. Он также будет работать, как и было обещано, при обычном переносе его в стек контроллера навигации.

Длинный ответ заключается в том, что Apple препятствует тому, что вы делаете. От «О пользовательских контроллерах представления» в Руководстве по программированию контроллера представления :

Примечание: если вы хотите разделить один экран в нескольких областях и управлять каждый в отдельности, используйте общий объекты контроллера (пользовательские объекты нисходящий от NSObject) вместо просматривать объекты контроллера для управления каждым подраздел экрана. Тогда используйте один объект контроллера представления к управлять общими объектами контроллера. Контроллер вида координирует общее взаимодействие экрана, но пересылает сообщения по мере необходимости на общие объекты контроллера, которыми он управляет.

Я столкнулся с проблемой, которую вы описываете, и в итоге первым выбрал подход , предложенный Мэттом Галлахером по «Какао с любовью» : создайте отдельный класс контроллера, который наследуется от NSObject (вместо UIViewController) и реализует UITableViewDelegate и UITableViewDataSource для управления табличным представлением. У него есть пример кода с его постом, который очень полезен, если вы решите пойти по этому пути. Когда я делал это, это в основном сводилось к простому изменению объявления наследования в моем пользовательском подклассе UITableViewController.

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

Что вы подразумеваете под встраиванием UITableViewController в UIViewController? Я вижу, как UITableView может быть встроен в UIView (у меня есть код, который делает это). Но встраивание контроллеров представления ...

Когда у меня есть UITableView в UIView, я делаю подкласс UIViewController, и он реализует UITableViewDelegate и UITableViewDataSource, например:

@interface MyViewController : UIViewController
        < UITableViewDelegate, UITableViewDataSource >
//...    
@end

Это позволяет одному IUViewController работать в двойном режиме. Это несколько скомпрометирует ваш автономный UITableViewController. Но вы могли бы создать некоторый класс делегатов, который реализует UITableViewDelegate и UITableViewDataSource и имеет экземпляр этого объекта, на который ссылается (как ivar) ваш UIViewController.

Просто идея ...

...