从Swift的CollectionViewCell中的rootViewController访问var
问题描述:
我想从不同的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()
它的工作原理。
我搞不清楚我做错了什么。任何帮助表示赞赏!
答
您必须有条件地投射rootViewController。你当前的代码只知道它是一个UIViewController,但为了它使用你的变量,它需要知道它是你的子类视图控制器的一个实例,ViewController
。
与此更换您的MainCollectionViewCell.init
应该解决的问题:
if let cvc = self.window!.rootViewController as? ViewController {
var testStringFromMainView = cvc.test
}
请注意,由于条件去包裹,这比强迫展开,该代码将不会被如果rootViewController
不是执行更安全类ViewController
的实例。换句话说,如果你的应用程序有多个视图控制器,你需要查看全局变量。
答
它不起作用,因为rootViewController
是一种UIViewController
并且没有test
属性。无论如何,这并不重要,因为你不应该试图做你正在尝试做的事情 - 单元试图导航到根视图控制器是不合适的。在单元中你需要的任何东西都应该从根视图控制器'向下'传递(参见依赖注入),并通过视图控制器传递给单元。通过这种方式,你的代码是合乎逻辑的,并且依赖关系很明显。你要做的是在你的视图层次结构的底部隐藏一个依赖项。你可以使它工作(与演员阵容),但你不应该。
如果我在单元格内有一个按钮,最好的做法是什么?触摸时应该改变我的rootViewController的属性?我怎样才能通过这个事件? – chl
通知或某种形式的委托,但它为什么在根视图控制器上? – Wain
我需要更改放置在根视图控制器上的约束(但会影响CollectionView的大小)......调用这样做的根视图控制器的函数也可以,但我猜这会和那个一样不恰当我打算使用。 – chl