动态加载视图

时间:2010-04-08 03:00:25

标签: iphone

案例1:

我已经创建了基于View的示例应用程序,并尝试执行下面的代码。当我按下“作业列表”按钮时,它应该加载另一个“Back Btn”的视图。

在测试功能中,如果我使用

[self.navigationController pushViewController:jbc animated:YES];

没有任何东西被加载,

但如果我使用

[self presentModalViewController:jbc animated:YES];

它会加载另一个带有“Back Btn”的视图。

案例2:

我确实创建了另一个基于导航的应用程序并使用了

[self.navigationController pushViewController:jbc animated:YES];

它按我的意愿工作。

有人可以解释为什么它在案例1中不起作用。它是否与选择的项目类型有关?

@interface MWViewController : UIViewController {

}

-(void) test;

@end

@interface JobViewCtrl : UIViewController {

}

@end

@implementation MWViewController

(void)viewDidLoad {

UIButton* btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

btn.frame = CGRectMake(80, 170, 150, 35);

[btn setTitle:@"Job List!" forState:UIControlStateNormal];

[btn addTarget:self action:@selector(test)

      forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];

[super viewDidLoad]; }

-(void) test

{

JobViewCtrl* jbc = [[JobViewCtrl alloc] init];

[self.navigationController pushViewController:jbc animated:YES]; //[self presentModalViewController:jbc animated:YES];

 [jbc release];
}

(void)dealloc {

[super dealloc];

}

@end

@implementation JobViewCtrl

-(void) loadView

{

self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];

self.view.backgroundColor = [UIColor grayColor];

UIButton* btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

btn.frame = CGRectMake(80, 170, 150, 35);

[btn setTitle:@"Back Btn!" forState:UIControlStateNormal];

[self.view addSubview:btn];

}

@end

3 个答案:

答案 0 :(得分:0)

答案在于,在基于导航的应用程序中,除了模态视图之外的所有新视图的父视图控制器都是UINavigationController。其中有一个属性导航栏,后者又具有属性后退按钮。现在,当你在基于导航的应用程序中推送任何视图时,默认情况下会在导航栏的左侧显示一个后退按钮。

现在在基于视图的应用程序中,没有这样的导航控制器作为ur视图的父视图控制器。在这些类型的应用程序中,视图逐个添加在另一个的顶部。顶视图的行为与其下方视图的子视图相同。因此没有导航栏的概念,所以没有后退按钮。

我担心你怎么能看到一个模态视图,(如果你不是自己添加一个导航控制器,你可以看看你是否已经自己添加了任何导航控制器,但是情况会是这样的在基于视图的应用程序中放置在我的第一点)。

谢谢,

Madhup

答案 1 :(得分:0)

首先创建你的根视图控制器&然后使用推视图控制器......

答案 2 :(得分:0)

最近,我提出了与你评论相同的问题。我已经解决了。请确保在使用[self navigationController]之前,它不是零。假设'self'是viewController A,那么你应该处理以下内容:

在你的app委托中,你应该像这样初始化一个导航控制器:

UINavigationController *m_controller;
 m_controller = [[UINavigationController alloc] initWithRootViewController: viewController A];

然后将导航控制器的视图添加到窗口并使其显示如下:

[window addSubView:m_controller.view];

最后,记得发布m_controller。

[m_controller release];

最后,以下代码将运行良好:

[self.navigationController pushViewController:jbc animated:YES];
嗯,恭喜,这个谜题已经消失了。