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

时间:2014-10-01 19:33:42

标签: swift reloaddata

我想从我的ImageDownloader.swift文件中访问我的ViewController.swift中声明的IBOutlet;即,(ImageDownloader.swift - > ViewController.swift)。
但编译器无法找到它。

enter image description here

注意:目标对象是类(ViewController)的成员,因此不是全局的。

ViewController.swift: {Calling Target}

enter image description here

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'

enter image description here 如何在不同的.swift文件中引用IBOutlet var?

<小时/> 这是我试图做的Obj-C版本:

@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;
...
dispatch_async(dispatch_get_main_queue(), ^{
    [self.collectionView reloadData];
});

...而不是从SAME swift文件中引用collectionView,我引用另一个swift文件。

......也许这是一个可怜的范式;根据反馈使用闭包。

1 个答案:

答案 0 :(得分:1)

问题是您的本地viewcontroller变量。我认为这实际上是一个属性(将其称为self.viewcontroller将有助于减少混淆)。我怀疑你有错字。也许你的意思是self.viewController

那就是说,你不应该试图直接访问另一个视图控制器的IBOutlets。 IBOutlets是视图控制器的实现细节。只要您修改用户界面,它们就会随时更改。

理想情况下,视图控制器应该是任何对象的委托,或者应该将闭包传递给此对象,以便视图控制器能够管理重新加载其自己的集合视图。

作为第二种最佳方法,您的视图控制器应该有一个方法,例如refresh(),您可以调用该方法来执行数据更改时所需的任何UI。这样,此对象不需要有关视图控制器的内部详细信息。