从子视图调用pushview

时间:2010-04-04 11:47:56

标签: iphone uinavigationcontroller pushviewcontroller

这是事情。我目前有一个tabBar控制器,里面有几个导航控制器。就像这样:

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

在我的第一个导航控制器中,我有一个名为NewsViewsController的视图控制器。这是它的笔尖(见图)。

我的目标是根据分段控件的位置显示/隐藏子视图(内部有tableview)。这样,我可以为每个tableview有两个separate viewControllers。这实际上是有效的。这是结果(见图)。

我的问题是以下问题。当我尝试单击一个单元格时,pushview不起作用。的确,我的self.navigationController为null。如何使用父导航控制器推送我的详细信息视图?

我的应用程序架构是错误的吗?谢谢=)

2 个答案:

答案 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];
}

希望这有帮助。