如何从同一目标中的不同.swift文件访问iVar?

如何从同一目标中的不同.swift文件访问iVar?,swift,reloaddata,Swift,Reloaddata,我想从我的ImageDownloader.swift文件访问我的ViewController.swift中声明的IBOutlet;i、 例如,(ImageDownloader.swift-->ViewController.swift)。 但编译器找不到它。 注意:目标对象是类(ViewController)的成员,因此不是全局对象。 ViewController.swift:{调用目标} ImageDownloader.swift:{调用源代码} let task = NSURLSe

我想从我的ImageDownloader.swift文件访问我的ViewController.swift中声明的IBOutlet;i、 例如,(ImageDownloader.swift-->ViewController.swift)。
但编译器找不到它。

注意:目标对象是类(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书。我一定会在这里遵循/研究你的“理想”解决方案。