我想从我的ImageDownloader.swift文件中访问我的ViewController.swift中声明的IBOutlet;即,(ImageDownloader.swift - > ViewController.swift)。
但编译器无法找到它。
注意:目标对象是类(ViewController)的成员,因此不是全局的。
ViewController.swift: {Calling Target}
ImageDownloader.swift: {Calling Source}
let task = NSURLSession.sharedSession().dataTaskWithURL(url) {(data, response, error) in
if let httpRes = response as? NSHTTPURLResponse {
if httpRes.statusCode == 200 {
self.image = UIImage(data:data)
dispatch_async(dispatch_get_main_queue(), {
viewcontroller.collectionView.reloadData() // ...compiler error.
})
}
}
}
编译器错误:
...使用未解析的标识符' collectionView'
如何在不同的.swift文件中引用IBOutlet var?
<小时/> 这是我试图做的Obj-C版本:
@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;
...
dispatch_async(dispatch_get_main_queue(), ^{
[self.collectionView reloadData];
});
...而不是从SAME swift文件中引用collectionView,我引用另一个swift文件。
......也许这是一个可怜的范式;根据反馈使用闭包。
答案 0 :(得分:1)
问题是您的本地viewcontroller
变量。我认为这实际上是一个属性(将其称为self.viewcontroller
将有助于减少混淆)。我怀疑你有错字。也许你的意思是self.viewController
。
那就是说,你不应该试图直接访问另一个视图控制器的IBOutlets。 IBOutlets是视图控制器的实现细节。只要您修改用户界面,它们就会随时更改。
理想情况下,视图控制器应该是任何对象的委托,或者应该将闭包传递给此对象,以便视图控制器能够管理重新加载其自己的集合视图。
作为第二种最佳方法,您的视图控制器应该有一个方法,例如refresh()
,您可以调用该方法来执行数据更改时所需的任何UI。这样,此对象不需要有关视图控制器的内部详细信息。