2015-06-21 82 views
1

我想從不同的viewController(它是一個CollectionViewCell)在我的rootViewController中訪問一個變量。從Swift的CollectionViewCell中的rootViewController訪問var

window!.rootViewController = ViewController() 

我宣佈了var像這樣:

import UIKit 

class ViewController: UIViewController { 

    var testString : String = "Test"; 

    override func viewDidLoad() {  
[…] 

並嘗試訪問這樣說:

import UIKit 

class MainCollectionViewCell: UICollectionViewCell { 
    override init(frame: CGRect) { 
     […] 
     super.init(frame: frame) 

     let mainView = self.window!.rootViewController 
     var testStringFromMainView = mainView.test 
[…] 

但所有我不斷收到是:

Type of expression is ambiguous without more context 

奇怪的是,當我嘗試例如

mainView.view.backgroundColor = UIColor.redColor() 

它的工作原理。

我搞不​​清楚我做錯了什麼。任何幫助表示讚賞!

回答

1

您必須有條件地投射rootViewController。你當前的代碼只知道它是一個UIViewController,但爲了它使用你的變量,它需要知道它是你的子類視圖控制器的一個實例,ViewController

與此更換您的MainCollectionViewCell.init應該解決的問題:

if let cvc = self.window!.rootViewController as? ViewController { 
    var testStringFromMainView = cvc.test 
} 

請注意,由於條件去包裹,這比強迫展開,該代碼將不會被如果rootViewController不是執行更安全類ViewController的實例。換句話說,如果你的應用程序有多個視圖控制器,你需要查看全局變量。

1

它不起作用,因爲rootViewController是一種UIViewController並且沒有test屬性。無論如何,這並不重要,因爲你不應該試圖做你正在嘗試做的事情 - 單元試圖導航到根視圖控制器是不合適的。在單元中你需要的任何東西都應該從根視圖控制器'向下'傳遞(參見依賴注入),並通過視圖控制器傳遞給單元。通過這種方式,你的代碼是合乎邏輯的,並且依賴關係很明顯。你要做的是在你的視圖層次結構的底部隱藏一個依賴項。你可以使它工作(與演員陣容),但你不應該。

+0

如果我在單元格內有一個按鈕,最好的做法是什麼?觸摸時應該改變我的rootViewController的屬性?我怎樣才能通過這個事件? – chl

+0

通知或某種形式的委託,但它爲什麼在根視圖控制器上? – Wain

+0

我需要更改放置在根視圖控制器上的約束(但會影響CollectionView的大小)......調用這樣做的根視圖控制器的函數也可以,但我猜這會和那個一樣不恰當我打算使用。 – chl