iPhone开发【二】重写HelloWorld(不使用XIB)

转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/8029211 作者:张燕广

关键字:HelloWorld iPhone IOS 不用XIB

上一篇iPhone开发【一】从HelloWorld开始使用XIB实现了一个HelloWorld程序,程序虽小,但是也算能够基本体验iPhone开发啦。

初始化及展示UI组件,除了使用XIB还可以手工编写Code实现,本篇通过重写上篇的HelloWorld进行演示手工初始化UI组件。

复制上篇的工程HelloWorld,将目录名称修改为HelloWorld2,然后打开该工程 。

将HelloWorldViewController.m中的- (void)viewDidLoad方法修改为如下所示:

[cpp]  view plain copy
  1. <span style="font-family:Microsoft YaHei;font-size:18px;">- (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     // Do any additional setup after loading the view, typically from a nib.  
  5.     NSLog(@"viewDidLoad");  
  6.       
  7.     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 100)];    
  8.     label.text=@"Hello World 1";    
  9.     [self.view addSubview:label];  
  10. }</span>  
编译、运行程序,效果如下所示:

iPhone开发【二】重写HelloWorld(不使用XIB)_第1张图片

运行程序发现:xib加载的UI组件和手工初始化的UI组件同时正常运行!


代码说明:UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 100)];

初始化了一个UILable组件,它的位置为坐标为(0, 0, 150, 100)的Rect,坐标系原点为lable的父View左上角。label的父View是谁呢?[self.view addSubview:label];将label加入到self.view中,self.view是当前视图控制器HelloWorldViewController的view,也就是label的父view。

按住Command键点击viewDidLoad方法,打开UIViewController.h查看该方法的解释:

// Called after the view has been loaded. For view controllers created in code, this is after -loadView. For view controllers unarchived from a nib, this is after the view is set.

view加载完毕后会调用该方法。

对于在代码中创建的view controllers,viewDidLoad会在loadView之后调用。

view设置之后,view controllers解档nib文件(nib即xib)。

所以,viewDidLoad方法主要工作是解档当前视图控制器加载的xib文件。既然是这样,那么我们在该方法中手工初始化UI组件是不合适的(因为这不该是viewDidLoad的工作职责)。那么应该在哪儿编写初始化UI组件的代码呢???

上面viewDidLoad的解释中提高了loadView,而且loadView在viewDidLoad之前调用,在UIViewController.h中- (void)loadView方法就在viewDidLoad的上面,该方法的解释是:

 // This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly.

如果不使用nib,子类(UIViewController的子类)应该实现该方法创建自己的视图层。

不要直接调用该方法。

找到了,这正是代码手工初始化UI组件的方法。

编写代码试一下,修改HelloWorldViewController.m,在viewDidLoad下方,实现loadView方法,修改后的代码如下:

[cpp]  view plain copy
  1. <span style="font-family:Microsoft YaHei;font-size:18px;">- (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     // Do any additional setup after loading the view, typically from a nib.  
  5.     NSLog(@"viewDidLoad");  
  6.       
  7.     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 100)];    
  8.     label.text=@"Hello World 1";    
  9.     [self.view addSubview:label];  
  10. }  
  11.   
  12.   
  13. // This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly.```  
  14. -(void)loadView{  
  15.      NSLog(@"loadView");  
  16.     UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectMake(0, 110, 150, 100)];    
  17.     label2.text=@"Hello World 2";    
  18.     [self.view addSubview:label2];  
  19.     [label2 release];  
  20.  }</span>  
编译、运行程序,并非我们预期的那样,控制台一直在输出HelloWorld[920:f803] loadView,模拟器黑屏。

loadView一直在被调用,就是无法显示出View。

仅实现viewDidLoad方法时,视图控制器的view是从xib解档初始化的,当实现loadView时,loadView在viewDidLoad之前调用,谁为我们初始化视图控制器的view呢?

必须我们来做,修改loadView方法,如下:

[cpp]  view plain copy
  1. <span style="font-family:Microsoft YaHei;font-size:18px;">// This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly.```  
  2. -(void)loadView{  
  3.      NSLog(@"loadView");  
  4.     //手工初始化view  
  5.     UIView *view = [[ UIView alloc] initWithFrame:[ UIScreen  
  6.                                                    mainScreen].applicationFrame] ;  
  7.     //设置view  
  8.     self.view = view;  
  9.     UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectMake(0, 110, 150, 100)];    
  10.     label2.text=@"Hello World 2";    
  11.     [self.view addSubview:label2];  
  12.     [label2 release];  
  13.  }</span>  
编译、运行程序,效果如下所示:

iPhone开发【二】重写HelloWorld(不使用XIB)_第2张图片

OK,到现在仍然是XIB模式与手工编写代码共存,修改HelloWorldViewController.m中- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:方法,将self.viewController = [[[HelloWorldViewController alloc] initWithNibName:@"HelloWorldViewController" bundle:nil] autorelease];修改为self.viewController = [[HelloWorldViewController alloc]init];不再加载HelloWorldViewController.xib文件;再删除HelloWorldViewController.m中的viewDidLoad方法。

现在完全是手工初始化UI组件了,黑背景是在难看,修改loadView方法在self.view = view;之前为view添加如下代码为view设置红色背景:

UIColor *bgColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1.0];
    [view setBackgroundColor:(bgColor)];

编译、运行效果如下:

iPhone开发【二】重写HelloWorld(不使用XIB)_第3张图片


点击下载本文源代码

你可能感兴趣的:(iPhone开发【二】重写HelloWorld(不使用XIB))