2015-05-12 77 views
1

調用視圖控制器方法在AppDelagate我調用的方法無法從AppDelegate中

func example() { 
    ViewController().test() 
} 

,並在我的ViewController方法下面是

func test() { 
    testView.userInteractionEnabled = true 
    buttonTapped(UIButton()) 
    restartTimer() 
} 

但它崩潰每當我調用該方法,由於testView沒有錯誤。 testView是ViewController中的一個視圖,而不是AppDelegate中的視圖,但我不知道如何使它執行,就像我在ViewController中調用它一樣。

+0

以您沒有創建故事板的方式創建ViewController的實例。我假設你的testView是一個IBOutlet? – ad121

+0

testView是一個IBOutlet – Sason

+0

你在AppDelegate中導入了ViewController嗎? –

回答

1

IBOutletnil,直到視圖控制器調用viewDidLoadviewDidLoad沒有發生,因爲你試圖通過調用ViewController()直接實例化類。

因此,testView是零,如預期。無論如何,你的AppDelegate不應該對ViewController邏輯負責。

+0

它完成viewDidLoad方法後仍然崩潰 – Sason

+0

它沒有完成'viewDidLoad'方法。 –

0

正如您現在可能知道的那樣,由於您在獲得初始化機會之前訪問IBOutlet,因此您的崩潰正在發生。所以我猜testView聲明排序是這樣的:

@IBOutlet weak var testView: UIView! 

解決方案A

你可以把它改爲可選避免這種碰撞:

@IBOutlet weak var testView: UIView? 

和更改語法在你的VC中:

testView?.userInteractionEnabled = true 

溶液B

如果你真的需要把用戶交互關在這一點上,你可以強制視圖加載:

let myVc = ViewController() 
_ = myVc.view // this will force the myVc.view to be loaded 
myVc.test() 

這樣你IBOutlet旨意有之前初始化的機會你運行test()方法。