IOS UIViewController

  IOS里面采用了MVC的体系结构,在UI方便的具体表现为View加ViewController。因此UIViewController是IOS应用当中很是经常使用并且很重要的一个类。xcode

  一,UIViewController:通常使用都是本身写一个类继承UIViewController这个类。在UIViewController里面有一个很重要的属性那就是View,也就是这个Controller对应的View,MVC里面的V和C。能够经过覆盖其中的loadView方法来手动建立View而后把它设置到Controller的属性中。app

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

  载入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文件进行载入。也能够指定文件的名字和程序包:ui

- (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:spa

  咱们看到的应用不少都是用到了底部的一个导航条,而UITabBarController就能够很好的实现这个功能。只要为UITabBarController设置一组UIViewController,它就会自动生成一个导航条。建立一个导航条:code

- (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的生命周期:blog

1,初始化UIViewController:经过alloc,init一类的方法来建立和初始化。继承

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

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

3,视图的卸载:

  视图卸载在有一些状况下不能依靠自动,由于有可能会形成内存泄露。若是视图控制对象没有指向子视图的强引用,就不须要手动释放(覆盖viewDidUnload方法),不然须要手动对相关视图进行释放。

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

 

  学习笔记,仅供参考

相关文章
相关标签/搜索