在我的collectionView单元中,我有一个嵌套的集合视图。它是在进行api调用(didSet)之后第一次更新的,但是当我尝试将数据追加到数据源数组并重新加载collectionView时,在加载更多机制中。更改未反映出来。这是我的代码
class PhotosCollectionViewController:
UICollectionViewCell,UICollectionViewDelegate,
UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
let network = networkingService()
let keychain = KeychainSwift()
var userID: String?
var code: String?
var platesID: String!{
didSet{
let parameters: Parameters = ["code": code!, "userID": userID!,
"plateID": platesID!]
network.makeGetRequestDecodable(parameters: parameters, url:
"endpoint") { (reponse) in
do {
let modeled = try JSONDecoder().decode([gps_sing].self, from:reponse)
self.gps_singleton_posts = modeled
print("Reload Method Called")
self.appsCollectionView?.reloadData()
} catch let err {
print(err)
}
}
}
}
var gps_singleton_posts: [gps_sing]?
let gridId = "gridID"
var appsCollectionView: UICollectionView? = {
let layout = UICollectionViewFlowLayout()
layout.minimumInteritemSpacing = 0
layout.minimumLineSpacing = 3
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
collectionView.backgroundColor = UIColor.white
collectionView.translatesAutoresizingMaskIntoConstraints = false
return collectionView
}()
override init(frame: CGRect) {
super.init(frame: frame)
if let value = keychain.get("userID") {
self.userID = value
// print("keychain\(self.userID!)")
}
if let value = keychain.get("security_token") {
self.code = value
// print("keychain\(self.code!)")
}
appsCollectionView?.dataSource = self
appsCollectionView?.delegate = self
appsCollectionView?.contentInset = UIEdgeInsetsMake(60, 0, 0, 0)
appsCollectionView?.scrollIndicatorInsets = UIEdgeInsetsMake(60,
0, 0, 0)
addSubview(appsCollectionView!);
addConstraintsWithFormat("H:|[v0]|", views: appsCollectionView!)
addConstraintsWithFormat("V:|[v0]|", views: appsCollectionView!)
appsCollectionView?.register(ImageCell.self,
forCellWithReuseIdentifier: gridId)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 123, height: 123)
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
print(gps_singleton_posts)
if let count = gps_singleton_posts?.count{
return count
}
return 0
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let parameters: Parameters = ["code": code!, "userID": userID!,
"plateID": platesID!,"token":"loadScroll","lim":gps_singleton_posts!
[(gps_singleton_posts!.count)-1].id!]
network.makeGetRequestDecodable(parameters: parameters, url: "get/getGridPS.php") { (reponse) in
do {
let modeled = try JSONDecoder().decode([gps_sing].self, from:reponse)
for model in modeled{
self.gps_singleton_posts?.append(model)
}
print("Reload Method Called")
collectionView.reloadData()
print(self.gps_singleton_posts)
} catch let err {
print(err)
}
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
print(self.gps_singleton_posts?.count)
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: gridId, for: indexPath)
as! ImageCell
cell.backgroundColor = UIColor.red
cell.singlePost = gps_singleton_posts![indexPath.row]
return cell
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.isScrollEnabled = false
}
}
class ImageCell: UICollectionViewCell {
var imageViewGrid: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.frame = CGRect(x: 0, y:0 , width: 100, height: 100)
imageView.image = UIImage(named: "delete")
imageView.clipsToBounds = true
imageView.translatesAutoresizingMaskIntoConstraints = false
return imageView
}()
var textLabel: UILabel = {
let lv = UILabel()
lv.textColor = UIColor.red
lv.translatesAutoresizingMaskIntoConstraints = false
return lv
}()
var singlePost: gps_sing! {
didSet{
let imageUrl = singlePost.uid
print(imageUrl!)
imageViewGrid.setImageWith(NSURL(string: imageUrl!)! as URL)
}
}
override init(frame: CGRect) {
super.init(frame: frame)
setUpViews()
}
func setUpViews(){
addSubview(imageViewGrid)
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": imageViewGrid]))
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": imageViewGrid]))
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
在上面的代码中(didSelectAt)函数用于加载更多项目。.但是更改不会反映出来。请帮我。非常感谢您回答我的问题。
答案 0 :(得分:1)
首先:永远不要在并行线程中更改布局。
我看到在 platesID 的didSet
中,您正在执行API调用,并且在响应中您试图重新加载collectionview。这种操作必须在主线程中完成!尝试以这种方式包装collectionview.reloadData()
DispatchQueue.main.async { [weak self] in
self?.appsCollectionView?.reloadData()
}
我不知道这是否可以解决您的所有问题,但是reloadData()操作在辅助线程中可能无法正常工作。
布局操作必须始终在主线程上启动。
答案 1 :(得分:1)
因此,我找到了解决问题的方法。在上面的集合视图中,我禁用了滚动功能。.由于该原因,重新加载数据后未显示添加的内容。一旦启用滚动,数据就会开始显示。