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文件中的頂層視圖的對象的引用,必須使用強引用。

 

  學習筆記,僅供參考

相關文章
相關標籤/搜索