gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:21:45 25 4
gpt4 key购买 nike

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

enter image description here

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

ViewController.swift: {调用目标}

enter image description here

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.
})

}
}
}

编译器错误:

...Use of unresolved identifier '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];
});

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

...也许这是一个不好遵循的范例;根据反馈,使用闭包代替。

最佳答案

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

也就是说,您不应该尝试直接访问另一个 View Controller 的 IBOutlet。 IBOutlet 是 View Controller 的实现细节。当您修改用户界面时,它们可能会发生变化。

理想情况下, View Controller 应该是任何对象的委托(delegate),或者应该将闭包传递给该对象,以便 View Controller 能够管理重新加载其自己的 Collection View 。

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

关于swift - 如何从同一目标内的不同 .swift 文件访问 iVar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26149142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com