@NatashaTheRobot 在他的博客(iOS開發教程)中提到了這個問題地址為The One Weird Trick For Testing View Controllers in Swift
我注意到有2個流:一個是當一個試圖控制器沒有指派一個window作為根視圖控制器時,另一個是指派根控制器時(例如,當你想要從storyboard測試你實例化視圖控制器時)
視圖控制器作為一個根視圖
下面是swift代碼
if self.window == nil { self.window = UIWindow(frame: UIScreen.mainScreen().bounds) } let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) let vc = storyboard.instantiateViewControllerWithIdentifier("ViewController") self.window!.rootViewController = vc
這是應用程序流的啟動的地方
DidFinishLaunchingWithOptions:方法。
程序流開始通過調用 makeKeyAndVisible 方法的調用 addRootViewControllerViewIfPossible 方法試圖將視圖的根視圖控制器添加到本身並介紹了它的 UIWindow。UIWindow 訪問視圖屬性的根視圖控制器開始一連串的加載視圖的過程。訪問器調用 loadViewIfRequired 方法的調用 loadView 方法。LoadView 調用內部方法的 UIViewController 加載將設置一個視圖。
還有一個從今年的 wwdc 大會涵蓋演示圖板在運行時 — — 在界面生成器中執行 UI 設計的行為。加載的視圖設置後,視圖控制器調用其內部的 _window 方法,閱讀所有的東西,像 preferedInterfaceOrientation、 supportedInterfaceOrientations、 shouldAutorotate 等。實際上它多次調用 _window ,也有一些其他方法。
其中 viewWillAppear 顯示視圖控制器。視圖是以提交所以有對 willMoveToWindow 的調用:,willMoveToSuperview: 和 _didMoveFromWindow:toWindow: 方法。接下來的事情設置自動版式中的視圖、 這麼 layoutMarginsDidChange、 didMoveToWindow、 didMoveToSuperview、 updateViewConstraints、 updateConstraints、 layoutSublayersOfLayer、 viewWillLayoutSubviews,調用 layoutSubviews 方法 — — 還有很多人。最後 viewDidAppear: 。
在測試中加載的視圖控制器
這是另一個重要案例值得探討。在這種情況下你可能不想創建窗口和視圖控制器測試下的把它。你只是想要實例化視圖控制器實例從演示圖板和測試它。
在娜塔莎的帖子之前我知道只有一個方法來加載視圖的視圖控制器,並確保它被加載。我做到了,訪問視圖屬性直接創建視圖控制器後。今天學會 loadViewIfNeeded 方法,可自 iOS 9 而像訪問視圖屬性的相同的方式。我也學會了第三 — — 國際海事組織在測試過程中加載視圖控制器並確保它的最佳方法是准備使用 — — 提出的 Ørta。這是關於調用 beginAppearanceTransition: 動畫和 endApperanceTransition 方法。這裡有他共享 — — 涵蓋以下方面的解決方案
直接訪問視圖
讓我們看流時直接訪問視圖。
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) let vc = storyboard.instantiateViewControllerWithIdentifier("ViewController") _ = vc.view
視圖已訪問並加載。窗口為零,因此,我認為沒有更多的方法被調用,進入 viewDidLoad。有點陌生。某些配置可能在 viewWillAppear 或 viewDidLoad 裡面。此方法應該工作在大多數測試用例。loadViewIfNeeded 的工作方式相同。
讓我們看一下如何 beginApperanceTransition: 動畫: 行為。
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) let vc = storyboard.instantiateViewControllerWithIdentifier("ViewController") vc.beginAppearanceTransition(true, animated: false) vc.endAppearanceTransition()
總結
你可以看到加載視圖流量取決於在使用哪些上下文視圖控制器和視圖。第一種情況有了一個視圖和視圖控制器是一個根,所以它有大量的配置和查看配置太。在最後一種情況就只是視圖控制器配置因為沒有窗口和配置視圖是不必要。此方法還模擬呈現視圖控制器因此被調用了 viewWillAppear 和 viewDidAppear 的方法 — — 這可能是重要的在某些情況下。
本文由iOS開發教程網站51ios翻譯自szulctomasz,轉載請注明來源http://www.51ios.net/iosknow/5719.html