如何从同一目标中的不同.swift文件访问iVar?
我想从我的ImageDownloader.swift文件访问我的ViewController.swift中声明的IBOutlet;i、 例如,(ImageDownloader.swift-->ViewController.swift)。如何从同一目标中的不同.swift文件访问iVar?,swift,reloaddata,Swift,Reloaddata,我想从我的ImageDownloader.swift文件访问我的ViewController.swift中声明的IBOutlet;i、 例如,(ImageDownloader.swift-->ViewController.swift)。 但编译器找不到它。 注意:目标对象是类(ViewController)的成员,因此不是全局对象。 ViewController.swift:{调用目标} ImageDownloader.swift:{调用源代码} let task = NSURLSe
但编译器找不到它。 注意:目标对象是类(ViewController)的成员,因此不是全局对象。 ViewController.swift:{调用目标} ImageDownloader.swift:{调用源代码}
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变量?
以下是我尝试做的Obj-C版本:
@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;
...
dispatch_async(dispatch_get_main_queue(), ^{
[self.collectionView reloadData];
});
…其中,我引用的不是同一swift文件中的collectionView,而是另一个swift文件。
…也许这是一个不好的范例;根据反馈使用闭包。问题在于您的本地
viewcontroller
变量。我假设这实际上是一个属性(将其称为self.viewcontroller
将有助于减少混淆)。我怀疑你有打字错误。例如,您可能指的是self.viewController
也就是说,您不应该尝试直接访问另一个视图控制器的IBOutlet。IBOutlets是视图控制器的实现细节。它们随时可能在您修改UI时发生更改
理想情况下,视图控制器应该是该对象的委托,或者应该向该对象传递闭包,以便视图控制器能够管理重新加载自己的集合视图
作为第二种最佳方法,视图控制器应该有一个方法,例如
refresh()
,当数据发生更改时,可以调用该方法来执行所需的任何UI操作。这样,此对象就不需要有关视图控制器的内部详细信息。错误消息非常清楚:在Closure中应该有类似于viewcontroller.collectionView.reloadData()的内容。我尝试了,但没有成功。因此修改了查询。您是如何声明变量viewcontroller的?请将此添加到您的问题完成。请参阅修订后的查询。根据@Athony的评论,您必须实际拥有一个变量,除非您的帖子中仍然缺少一些代码。能否显示在调用类中声明(名称不正确的)“viewController”属性的位置?因为collectionView不是一个类变量(而且它们还不受支持),所以还不清楚如何/在何处存储它。这与IBOutlet无关,只是范围界定。我补充了说明。但是我注意到你的建议,即在结束时使用委托范例。。。顺便说一句:我认识你的名字。买了你的iOS 6书。我一定会在这里遵循/研究你的“理想”解决方案。