我有一个UICollectionView位于UITableViewCell内,其中集合视图的图像从后台线程中获取。 我遇到的问题是,无法调用collectionView.reloadData,因为我无法设置UICollectionView的属性,因为它位于tableViewCell中。 有什么办法在后台线程完成查询后重新加载集合视图的数据吗?
我有一个UICollectionView位于UITableViewCell内,其中集合视图的图像从后台线程中获取。 我遇到的问题是,无法调用collectionView.reloadData,因为我无法设置UICollectionView的属性,因为它位于tableViewCell中。 有什么办法在后台线程完成查询后重新加载集合视图的数据吗?
子类化UITableViewCell并添加方法以及对其集合视图的引用。在那里处理您的调用。我假设您已经将集合视图设置为表视图控制器的属性。
例如:
CollectionViewTableCell.h:
@interface CollectionViewTableCell : UITableViewCell
@end
CollectionViewTableCell.m:
@interface CollectionViewTableCell ()
@property (nonatomic, weak) @IBOutlet UICollectionView* collectionView;
@end
@implementation CollectionViewTableCell
-(void) awakeFromNib {
[self loadData];
}
-(void) loadData {
// load parse data asynchronously and then call reloadData on your collection view
}
// make sure to implement delegate/datasource methods for your collection view
@end
确实很容易(假设您的viewController、tabbleViewCell和CollectionViewCell都正常工作),在声明表视图的控制器中使用以下代码:
对于Swift 4
// 在您的ViewController中,每当您需要重新加载collectionViewCell时:
var myRow = 0 // include the index path row of your table view cell
var mySection = 0 // and the index path section
DispatchQueue.main.async(execute: {
if let index = IndexPath(row: myRow, section: mySection) as? IndexPath {
if let cell = self.MyTableView.dequeueReusableCell(withIdentifier: "cell", for: index) as? TableViewCell {
cell.collectionReloadData(section: mySection)
}
}
})
现在在你的TableViewCell中
class TableViewCell: UITableViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
@IBOutlet weak var collectionView: UICollectionView!
func collectionReloadData(){
DispatchQueue.main.async(execute: {
self.collectionView.reloadData()
})
}
}