HardBirch

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

时间:12-09-28 栏目:iOS移动应用开发技术 作者:张飞不张,文采横飞 评论:0 点击: 1,537 次

关键字: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模式与手工编写代码共存,修改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)

iPhone开发【二】重写HelloWorld(不使用XIB):等您坐沙发呢!

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐