IOS 的loadView 及使用loadView中初始化View注意的問題。(死迴圈並不可怕)

來源:互聯網
上載者:User

標籤:blog   http   io   color   os   使用   sp   檔案   資料   

在XCode 4.2後,我基本上的應用都不使用Xib檔案了,雖然xib檔案有很多好趣,可以快速免代碼構建視窗,可以減少好多代碼構建帶來的麻煩,其實能用xib還是不錯的,主要是我的機器開啟xib來編輯時太慢了,跑不動了,老古董 的機器了,所以不怎麼喜歡xib了(個人原因)。有人說xib會讓代碼跑起來效率慢,真的是這樣嗎?從理論上來看,APP要運行,先讀INFO.PLIST檔案,然後找到MAINWINDOW 的XIB,然後解釋XIB中的代碼來演變成OC代碼進行執行個體化。而用普通代碼構建,直接使用代碼CODE而不用翻譯XIB中的資料,省了一個步驟,或許就是這相原因吧。好了,這個先別討論了,回到loadView,每一個VC(ViewController)都會產生一個loadview方法,當然,很多情況下都不怎麼在這個方法中來寫視窗,而是在ViewDidLoad中來寫。先看看loadView調用的觸發條件吧。

 

APP 運行,先跑init 然後跑

 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 來尋找XIB中有沒有視圖view。如果有,則不會再走loadView。如果這個時候你的VC是沒有xib的,哪麼顯然走這個方法後,是找不到任何view的,即self.view 仍為nil.然後,就跑loadview,這個時候會被觸發,如果在loadView中,什麼也不做,也不執行個體化一個View。哪麼程式繼續跑到viewDidLoad裡,如果這裡還是沒有執行個體化VIEW。哪麼這個VC就沒有視窗。在這裡很多時侯會出現一個誤區 (死迴圈)。  好,下面來解釋一下死迴圈的條件。 1、沒有XIB。2、ViewController中的loadView方法中沒有做任何執行個體化self.view的操作。如:-(void)loadView{寫了一大堆代碼,但最好並沒有執行以下兩種方式中的其中一種。//方式一:執行個體化時使用[supper loadView];                   //方式二 : self.view = [UIView alloc]....       }3、在viewDidLoad中調用了self.view。 只要這三個條件同時滿足,必定死迴圈。方式一時,調用了[Supper LoadView] 這個時候由父類產生了一個(0,20,Width,height )。這裡的寬高根據是IPAD,還是IPHONE不同而不同,但原點座標一定是(0,20)即去除狀態條。方式二,沒有對self.view作任可賦值,所以使得self.View = nil;在條件二滿足的情況下,程式運行到步驟三,這個時候,如果在這裡調用了self.View。因為self.View在步驟二中為空白,所以又回調到了loadView來,但因loadView中沒有對self.View作執行個體化,於是在跑完loadView後,又繼續跑viewDidLoad,但因ViewDidLoad中又沒有執行個體化的情況下,使用了self.View.因此就出會現來回調用的現象。 好了,知疲知已方能百戰百勝。解決死迴圈。 在步驟二中下手,處理方式有三:a、把整個-(void)loadView 屏蔽掉。讓父類自己來建立一個VIEW。這個是最常見的,因為ViewController產生的時候預設代碼中是把這段代碼給注釋了的。b、在loadView中添加一句[Supper LoadView];個人不太建議這樣寫吧,當然如果你理解了VIEW之間的關係,也無所謂。c、在loadView中,使用已執行個體化的View對Self.View進行賦值。註:是使用=號賦值,而不是使用[self.view addSubView]因為此時self.view 是null 指標,執行ADD操作會崩潰的。 另外,也可以在步驟三中下手,即使在步驟二中沒有任何執行個體化VIEW操作,但在步驟三中進行了相應的執行個體化操作,仍可以解決的。這就是通常我們為什麼不開啟-loadView的注釋,而直接在ViewDidLoad中進行添加視窗。  好了,上面的死迴圈介紹完了,順便對使用下面兩個方法來執行個體化視窗注意的地方。 1、[[UIScreen mainScreen] bounds]    返回的Rect是以(0,0)為座標原點的大小,即包括了狀態列。 
2、[[UIScreen mainScreen]applicationFrame] 返回的Rect是(0,20)為座標點的大小,不包括狀態列。通常使用[supper loadView]所產生的的VIEW也就是這個所產生的。 如果在loadView中,調用[supper loadview];或使用self.view =[[ [UIView alloc]initWithFrame:[[UIScreen mainScreen]applicationFrame] ]autorelease]; 這樣在父子層之間使用AddSubView,你會看到一個位移量為20的層疊視窗。原因就是這兩個方式返回的RECT的原點都是(0,20);DEMO:A  Viewcontroller中的 - (void)loadView 

    [super loadView]; 
    //self.view  = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen]applicationFrame]] autorelease]; 
     
    //self.view  = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 200, 400)];  
                    
    self.view.backgroundColor = [UIColor greenColor]; 
    
    BVC *bvc = [[BVC alloc]init]; 
    NSLog(@"bvc View %@",bvc.view); 
    [self.view addSubview:bvc.view]; 

} B ViewController 中的 - (void)loadView 

    
    [super loadView]; 
    //self.view  = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen]applicationFrame]] autorelease]; 
    //self.view  = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 200, 400)];  
     
    self.view.backgroundColor = [UIColor redColor]; 
     
    CVC *cvc = [[CVC alloc]init]; 
    [self.view addSubview:cvc.view]; 
     
} c ViewController中的 - (void)loadView 

    [super loadView]; 
    //self.view  = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen]applicationFrame]] autorelease]; 
    //self.view  = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 300)];  
  
    self.view.backgroundColor = [UIColor blueColor]; 
} 最後運行效果: 如果想子視圖直接複蓋父視圖的大小可以使用[[UIScreen mainScreen] bounds]或者直接用UIVIEW執行個體化時指定原點。就這樣吧,希望這些對你有協助。

IOS 的loadView 及使用loadView中初始化View注意的問題。(死迴圈並不可怕)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.