[英]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()
有用。
我不知道自己在做什么错。 任何帮助表示赞赏!
这是行不通的,因为rootViewController
是UIViewController
的一种,并且没有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.