2015-07-21 41 views
0

我一直停留在這幾天來分配 -「意外地發現無」 - 委派subVC

graphView是我的UI類的實例 - 我聲明我CalculatorViewDataSource協議GraphView類以外,包含weak var calcDataSource: CalculatorViewDataSource?在裏面。

在我GraphViewController

,在graphView出口的didSet {}我嘗試委託設置爲我承擔的是使用下面的代碼現有CalculatorViewController:

if let vc = splitViewController?.viewControllers { 
      println(vc) 
      println(vc.count) 
      if let fst = vc.first { 
       println(fst.subviews) 
       println(fst.subviews.first) 
      } 
     } 
graphView.calcDataSource = splitViewController!.viewControllers.first!.subviews.first as CalculatorViewController 

的代碼編譯,但我崩潰與 「意外地發現無」 當我到達graphView.calcDataSource

(輸出)

[<UINavigationController: 0x7b71bd10>] 1 nil fatal error: unexpectedly found nil while unwrapping an Optional value

的分配

(故事板)

SplitViewController - NavigationController - (Master) CalculatorViewController 
    I 
NavigationController - (Detail) GraphViewController` 

========

解決了!

我工作圍繞這一問題,從內部prepareForSegue 工作(與按鈕故事板賽格瑞稱爲「顯示圖形」)

//CalculatorViewController.swift: 
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject!) { 
    if (segue!.identifier == "Show Graph") { 
     var yourNextViewController = (segue!.destinationViewController as UINavigationController) 
     var detail = yourNextViewController.viewControllers[0] as GraphViewController 
     var tempview = detail.view // FORCES THE VIEW object into existence, without this it will compile, but next line will crash at runtime (graphView nil) 
     detail.graphView.calcDataSource = self 
    } 
} 

注意var tempview = detail.view是這裏的關鍵,儘管沒有被使用。我的理解,因爲它建立視圖和出口..

+0

展開全部自選,不要使用''特別是在調試!同時記錄你的splitViewController,第一個viewController等,看它是否在那裏,或者有多少。打印是你的朋友 – Kametrixom

+0

如何正確地登錄風險投資?用print()重載didLoad()?我如何爲通過故事板創建的VC(如splitViewController)做到這一點? – John

回答

0

如何(安全)解開選配:

graphView.calcDataSource = splitViewController!.viewControllers.first!.subviews.first as CalculatorViewController 

if let vc = splitViewController?.viewControllers { 
    println(vc) 
    if let fst = vc.first { 
     println(fst.subviews) 
     println(fst.subviews.first) 
    } 
} 
+0

假設if塊在賦值之前(得到輸出) – John