IOS UIViewController

  IOS里面采用了MVC的体系结构,在UI方便的具体表现为View加ViewController。所以UIViewController是IOS应用当中非常常用而且很重要的一个类。

  一,UIViewController:一般使用都是自己写一个类继承UIViewController这个类。在UIViewController里面有一个很重要的属性那就是View,也就是这个Controller对应的View,MVC里面的V和C。可以通过覆盖其中的loadView方法来手动创建View然后把它设置到Controller的属性中。

  除了直接用代码实例化View以外,还有一种很常用的方法,那就是xib文件。xib文件可以记录固化的view实例,它是由xcode的interface builder来生成和编辑的。编辑好xib以后也是可以在controller中将其载入。

  载入xib需要覆盖Controller中的:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nil bundle:nil];
    
    if(self != nil)
    {
        UITabBarItem *tbi = [self tabBarItem];
        
        [tbi setTitle:@"Time"];
        
        UIImage *img = [UIImage imageNamed:@"Time.png"] ;
        [tbi setImage:img];
        
    }
    return self;
}

  其中调用父类的时候两个参数都设置为了nil,这样的话,程序会在程序包里面寻找名字与类相同的xib文件进行载入。也可以指定文件的名字和程序包:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    NSBundle *appBundle = [NSBundle mainBundle] ;
    
    self = [super initWithNibName:@"TimeViewController" bundle:appBundle];
    
    if(self != nil)
    {
        UITabBarItem *tbi = [self tabBarItem];
        
        [tbi setTitle:@"Hypnosis"];
        
        UIImage *img = [UIImage imageNamed:@"Hypno.png"] ;
        [tbi setImage:img];
    }
    return self;
}

 二,UITabBarController:

  我们看到的应用很多都是用到了底部的一个导航条,而UITabBarController就可以很好的实现这个功能。只要为UITabBarController设置一组UIViewController,它就会自动生成一个导航条。创建一个导航条:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    
    // Override point for customization after application launch.
    
    //creat controllers and group
    HypnosisViewController *hvc =[[HypnosisViewController alloc] init];
    [[self window] setRootViewController:hvc];
    
    TimeViewController *tvc = [[TimeViewController alloc] init];
    [[self window] setRootViewController:tvc];
    
    NSArray *viewControllers = [[NSArray alloc] initWithObjects:hvc,tvc,nil];
    
    UITabBarController *tabBarController = [[UITabBarController alloc] init];
    [tabBarController setViewControllers:viewControllers];
    
    //set view root controller
    [[self window] setRootViewController:tabBarController];
    
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

默认的导航条的每一个tab都对应一个黑色的按钮没有任何东西,若想要定制每一个tab选项的显示,则可以分别设置UIViewController当中的UITabBarItem属性来做到:

UITabBarItem *tbi = [self tabBarItem];
        
        [tbi setTitle:@"Time"];
        
        UIImage *img = [UIImage imageNamed:@"Time.png"] ;
        [tbi setImage:img];

三,关于UIViewController的生命周期:

1,初始化UIViewController:通过alloc,init一类的方法来创建和初始化。

  对view的设置是必需的,但是我们不能在init方法中写任何由关于view的代码。因为view在有可能在被释放和重新载入,而init方法只有在初始化阶段才会执行,也就是说当view因为一些原因(比如说内存不足警告)被释放和重新载入以后写在init里面有关view的代码是不会被执行的。所以初始化view的代码应该在viewDidLoad方法里面写。

2,View在UIViewController中的载入有一种叫做延迟载入的机制,只有当view需要被放到屏幕上时controller才会将其载入。

3,视图的卸载:

  视图卸载在有一些情况下不能依靠自动,因为有可能会造成内存泄露。如果视图控制对象没有指向子视图的强引用,就不需要手动释放(覆盖viewDidUnload方法),否则需要手动对相关视图进行释放。

  为了避免由引用带来的内存泄露问题,通常都会将插头变量(IBOutlet)声明了弱引用。但是有一个例外:凡是针对xib文件中的顶层视图的对象的引用,必须使用强引用。

 

  学习笔记,仅供参考

posted @ 2013-07-29 20:10  nirvawolf  阅读(2733)  评论(0编辑  收藏  举报