2015-11-26 50 views
4

當我創建一個新的NSVC子類並添加一些IBOulets,它們總是零,當我嘗試訪問它們。我試過創建一個新項目,只有一個VC類,只有一個Outlet,但它仍然是零。IBOutlet是無視圖控制器Xcode 7

我已檢查他們是否確實連接。我試過用完整的筆尖名稱來實例化這個類。我也清理了這個項目,並拋棄了派生的數據。沒有任何區別。

那麼是什麼原因造成的?它正在與所有新項目合作;我爲我的舊項目添加了新的網點,並且它們工作正常。所有的IBOutlets都是零,不僅僅是少數。我在Xcode 7.1.1上。

我得到的錯誤是:

fatal error: unexpectedly found nil while unwrapping an Optional value

+1

當你正在測試爲直營店,你期間或之後測試'viewDidLoad'叫? – ThomasW

+0

@ThomasW我已經嘗試過和之後都是零。我剛剛重新創建了整個班級,現在我可以更改'viewDidLoad'中的值,但如果在此後隨時嘗試訪問它,則它是零。 – user14492

+2

你是如何加載視圖控制器? – ThomasW

回答

1

我發現了一個解決辦法,如果其他人正面臨着類似的問題。 IBOutlet是零,因爲它的超級視圖從未加載,所以,該應用程序從未創建它。一個簡單的黑客使用任何子視圖之前寫的:

let view = viewController.view 

這將創建視圖,因此其上的所有出口。

P.S.我知道這不是一個真正的解決方案,但我想不出另一個解決方案。如果有人有任何建議,請隨時發佈。

+1

對我來說這種方法很好,用於測試。 – d4Rk

0

我的猜測是,你正試圖在init方法中訪問插座,或者在視圖加載之前設置了值時訪問器。有兩種方法來處理這種情況。

首先是推遲更新子視圖,直到知道視圖已加載。我通過從viewWillAppear()調用updateView()方法來完成此操作。我通常也會在變量發生變化時調用這個方法,所以我會在繼續之前測試以確保視圖已經加載。如果視圖不存在,設置視圖沒有任何價值。它看起來是這樣的:

class MyViewController: UIViewController { 

    var product: Product { 
     didSet { 
      updateView() 
     } 
    } 

    @IBOutlet private weak var productNameLabel: UILabel! 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     updateView() 
    } 

    private func updateView() { 
     guard isViewLoaded() else { 
      return 
     } 

     if let product = product { 
      productNameLabel.text = product.title 
     } 
    } 
} 

另一種選擇,這類似於你在做什麼,是迫使以期及早加載。我認爲這不太理想,但在某些情況下,這是正確的做法。但是在做它,你發現的方式,這樣做更有意這樣的:

class MyViewController: UIViewController { 

    var product: Product { 
     didSet { 
      loadViewIfNeeded() 
      productNameLabel.text = product.title 
     } 
    } 

    @IBOutlet private weak var productNameLabel: UILabel! 
} 
相關問題