繁体   English   中英

在Swift的CollectionViewCell中从rootViewController访问var

[英]Access var from rootViewController in CollectionViewCell in Swift

我想从另一个ViewController(它是CollectionViewCell)中的rootViewController访问变量。

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()

有用。

我不知道自己在做什么错。 任何帮助表示赞赏!

这是行不通的,因为rootViewControllerUIViewController的一种,并且没有test属性。 无论如何,这无关紧要,因为您不应该尝试做您想做的事情-单元格试图导航到根视图控制器是不合适的。 单元中需要的任何内容都应从根视图控制器“向下”传递(请参阅依赖项注入),再通过视图控制器传递到单元。 这样,您的代码是合乎逻辑的,并且依赖关系显而易见。 您想要做的是在视图层次结构的底部隐藏一个依赖项。 您可以使其工作(通过强制转换),但您不应该这样做。

您必须有条件地转换rootViewController。 您当前的代码仅知道它是一个UIViewController,但是为了使其能够使用您的变量,它需要知道它是您的子类视图控制器ViewController的实例。

MainCollectionViewCell.init替换您的MainCollectionViewCell.init应该可以解决此问题:

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

请注意,由于条件解包比强制解包要安全得多,因此,如果rootViewController不是ViewController类的实例,则不会执行此代码。 换句话说,如果您的应用程序将具有多个视图控制器,则需要研究全局变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM