iPhone开发——HelloWorld (不使用XIB)

Home / iOS MrLee 2015-5-26 2828

初始化及展示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];  
}

编译、运行程序,效果如下所示:

1348822289_8100


运行程序发现: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方法,如下:
-(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];  
 }

编译、运行程序,效果如下所示:

1348822364_8571


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)];
编译、运行效果如下:

1348824269_2195


本文链接:https://www.it72.com/3052.htm

推荐阅读
最新回复 (0)
返回