2015-06-21 48 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

相关问题