转载请注明出处,原文网址: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方法修改为如下所示:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"viewDidLoad");
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 100)];
label.text=@"Hello World 1";
[self.view addSubview:label];
}
编译、运行程序,效果如下所示:
运行程序发现: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方法,修改后的代码如下:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"viewDidLoad");
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 100)];
label.text=@"Hello World 1";
[self.view addSubview:label];
}
// This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly.```
-(void)loadView{
NSLog(@"loadView");
UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectMake(0, 110, 150, 100)];
label2.text=@"Hello World 2";
[self.view addSubview:label2];
[label2 release];
}
编译、运行程序,并非我们预期的那样,控制台一直在输出HelloWorld[920:f803] loadView,模拟器黑屏。
loadView一直在被调用,就是无法显示出View。
仅实现viewDidLoad方法时,视图控制器的view是从xib解档初始化的,当实现loadView时,loadView在viewDidLoad之前调用,谁为我们初始化视图控制器的view呢?
必须我们来做,修改loadView方法,如下:
// This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly.```
-(void)loadView{
NSLog(@"loadView");
//手工初始化view
UIView *view = [[ UIView alloc] initWithFrame:[ UIScreen
mainScreen].applicationFrame] ;
//设置view
self.view = view;
UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectMake(0, 110, 150, 100)];
label2.text=@"Hello World 2";
[self.view addSubview:label2];
[label2 release];
}
编译、运行程序,效果如下所示:
OK,到现在仍然是XIB模式与手工编写代码共存,修改HelloWorldAppDelegate.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)];
编译、运行效果如下:
点击下载本文源代码