Вызов pushview из подпредставления - PullRequest
0 голосов
/ 04 апреля 2010

Вот эта вещь. В настоящее время у меня есть контроллер tabBar с несколькими контроллерами навигации в нем. Просто так:

http://tof.canardpc.com/view/d27d1361-c81b-43a0-9b5b-abb13d78e422.jpg

В моем первом навигационном контроллере у меня есть контроллер представления, называемый NewsViewsController. Вот его перо (см. Рисунок).

Моя цель - показать / скрыть подпредставления (с табличным представлением внутри) в соответствии с положением сегментированного элемента управления. Таким образом, у меня может быть два отдельных viewControllers для каждого табличного представления. Это на самом деле работает. И вот результат (см. Рисунок).

Моя проблема в следующем. Когда я пытаюсь нажать на ячейку, pushview не работает. Действительно, мой self.navigationController равен нулю. Как я могу выдвинуть мой подробный вид с помощью родительского контроллера навигации?

Не верна ли архитектура моего приложения? Спасибо =)

Ответы [ 2 ]

0 голосов
/ 10 декабря 2011

Я достиг этого, вызвав родительский метод из подпредставления - родительский метод выполняет push.

подвид:

@protocol SubUIViewDelegate
    -(void)pushViewController:(UIViewController*)ctrl;
@end

@interface ... {
   ...
   id<SubUIViewDelegate> delegate;
}
@property (nonatomic,assign) id <SubUIViewDelegate> delegate;
...
@end

Затем @synthesize делегата и используйте следующее для вызова push из подпредставления

[self.delegate pushViewController : new_view_ctrl];

Контроллер родительского представления:

@interface parentview : ... <SubUIViewDelegate> {
    ...
}
-(void) pushViewController: (UIViewController*) ctrl;

Реализует:

subview.delegate = self;

-(void)pushViewController:(UIViewController*)ctrl {
    [self.navigationController pushViewController:ctrl animated:YES];
}

Надеюсь, это поможет.

0 голосов
/ 04 апреля 2010

Контроллер навигации настроен так, чтобы выдвигать и выдвигать контроллер вида, который управляет всем видом. На самом деле ничто в API не поддерживает несколько контроллеров представления, чьи представления отображаются в одном и том же суперпредставлении.

Вместо того, чтобы пытаться выдвинуть следующий вид в одном из подпредставлений вида таблицы, вы должны управлять навигацией из контроллера «Просмотр новостей». Более того, у вас должен быть только контроллер «News View» и отдельные классы, которые реализуют делегат и источники данных каждой таблицы (они не обязательно должны быть в контроллере представления, это обычно просто удобно).

Примерно так:

@interface NewsViewController {
    CustomClass1 *newsTableDelegateAndDataSource;
    CustomClass2 *categoryTableDelegateAndDataSource;
}

@interface CustomClass1 {
    UINavigationController *nav;
}

в NewsViewController.m

- (void) viewWillAppear{
    self.newsTableDelegateAndDataSource.nav= // reference to the navigation controller;
    self.categoryTableDelegateAndDataSource.nav = // reference to the navigation controller;
}

Затем в методах didSelectRow одного из CustomClasses:

nextViewController=// intialize or get reference to next view controller
[self.nav pushViewController:nextViewController animated:YES];

Навигатор выдвинет nextViewController поверх NewsViewController и отобразит новый экран. Когда это будет сделано, он выскочит сам, и NewsViewController снова появится в том состоянии, в котором вы его оставили.

Таким образом, в любой момент времени у вас активен только один контроллер представления, поэтому API работает плавно, но вы инкапсулируете поведение каждой таблицы в своем собственном классе.

Все счастливы.

...