这是事情。我目前有一个tabBar控制器,里面有几个导航控制器。就像这样:
http://tof.canardpc.com/view/d27d1361-c81b-43a0-9b5b-abb13d78e422.jpg
在我的第一个导航控制器中,我有一个名为NewsViewsController的视图控制器。这是它的笔尖(见图)。
我的目标是根据分段控件的位置显示/隐藏子视图(内部有tableview)。这样,我可以为每个tableview有两个separate viewControllers。这实际上是有效的。这是结果(见图)。
我的问题是以下问题。当我尝试单击一个单元格时,pushview不起作用。的确,我的self.navigationController为null。如何使用父导航控制器推送我的详细信息视图?
我的应用程序架构是错误的吗?谢谢=)
答案 0 :(得分:0)
导航控制器设置为推送和弹出管理整个视图的视图控制器。 API中的任何内容都不容易支持多个视图控制器,这些视图控制器的视图显示在同一个超视图
您应该从“新闻视图”控制器管理导航,而不是尝试在其中一个tableview子视图上推送下一个视图。更好的是,你应该只有“新闻视图”控制器,并有单独的类来实现每个表的委托和数据源(它们不必在视图控制器中通常很方便。)
这样的事情:
@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;
}
然后在CustomClasses之一的didSelectRow方法中:
nextViewController=// intialize or get reference to next view controller
[self.nav pushViewController:nextViewController animated:YES];
nav会将nextViewController推送到NewsViewController之上并显示新屏幕。完成后,它会自动弹出,并且NewsViewController会在你离开它的状态下重新出现。
这样,您在任何时候只有一个视图控制器处于活动状态,因此API可以顺利运行,但您可以将每个表的行为封装在自己的类中。
每个人都很开心。
答案 1 :(得分:0)
我通过从子视图调用父方法来实现这一点 - 父方法执行推送。
子视图:
@protocol SubUIViewDelegate
-(void)pushViewController:(UIViewController*)ctrl;
@end
@interface ... {
...
id<SubUIViewDelegate> delegate;
}
@property (nonatomic,assign) id <SubUIViewDelegate> delegate;
...
@end
然后@synthesize委托并使用以下内容从子视图调用推送
[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];
}
希望这有帮助。