用代碼初始化ViewController的View


閑話一點:看來大學的學習內容還是有用的,即使是我們覺得毫無作用的內容:至少它們開拓了我們的眼界,讓我們知道還有這樣一門技術。

由於上學期學習了軟件測試,就一直想應用於真實的代碼測試中去。但是最近一直覺得iPhone應用有一些獨特之處。這種獨特之處是所有基於界面的軟件所共有的:移動應用,網頁應用等。仔細一想,其實所有的軟件都是基於界面的嘛。。。

iPhone應用之獨特之處在於:它擁有龐大的與界面相關的方法和Property,而這些東西比較難於進行自動化測試;而且,由於與某種界面(如UITableView)相關的Protocol(如UITableViewDelegatt和UITableViewDataSource)也難於進行測試,導致iPhone應用比較難以測試。我在網上也沒有找到多少測試的資源。

下面進入正題。

前兩天嘗試了一下對iPhone界面進行測試,遇到一個問題。

我建立了一個簡單的基於Single View的類,里面有一個Label,名為show,一個Button,它的TouchUpInsideDown動作對應着buttonPressed方法:將show的text改為"hello"。

這個View是用Interface Builder生成的。

代碼如下:

 

  1. -(IBAction)buttonPressed:(id)sender{  
  2.     [self.show setText:@"hello"];  
  3. }  
-(IBAction)buttonPressed:(id)sender{
    [self.show setText:@"hello"];
}
在模擬器上跑了一下,成功。

 

我想對buttonPressed方法進行測試,於是新建了一個Test方法,方法內容如下:

 

  1. ViewController* controller =[ [ViewController alloc] init];  
  2. [controller buttonPressed:nil];  
  3. NSLog(@"%@",controller.show.text);  
ViewController* controller =[ [ViewController alloc] init];
[controller buttonPressed:nil];
NSLog(@"%@",controller.show.text);
但是打印出來的結果是NULL。

 

仔細思索了一下,我認為應該是ViewController的view沒有初始化,導致無法對controller.show進行操作。根據自己的思考和別人的回答(此頁面),找到一種初始化view的方法,代碼如下:

 

  1. ViewController* controller = [[ViewController alloc]initWithNibName:@"ViewController_iPhone" bundle:nil];  
  2. UIView* view = controller.view;  
  3. [controller buttonPressed:nil];  
  4. NSLog(@"%@",controller.show.text);  
ViewController* controller = [[ViewController alloc]initWithNibName:@"ViewController_iPhone" bundle:nil];
UIView* view = controller.view;
[controller buttonPressed:nil];
NSLog(@"%@",controller.show.text);

代碼有兩點要注意的地方:一是初始化的時候,要使用initWithNibName方法;二是要至少引用一下controller.view,這樣才會初始化這個view;英語原話是“Any reference to the view would also have caused it to load”。

 

這樣,打印出來的就是“hello”了!

PS:現在有的工程使用的是storyboard,導致沒有nib文件,這時該怎么初始化ViewController呢?

我們可以在storyboard里設置某個ViewController的Identifier,比如為"TestViewControoler",然后使用

 

  1. UIStoryboard * storyboard = [ UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil ];   
  2. controller = [storyboard instantiateViewControllerWithIdentifier:@"TestViewController" ];  
UIStoryboard * storyboard = [ UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil ]; 
controller = [storyboard instantiateViewControllerWithIdentifier:@"TestViewController" ];
方法,這樣就可以了。

嗯,以后慢慢研究Test-Driven Programming。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM