在我的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:
"get/getGridPS.php") { (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")
}
}
谢谢您的回答!
答案 0 :(得分:0)
无需禁用滚动,则不应这样做。有一些API可以重新加载您所需的UICollectionView
的一部分,而不会影响其余部分。您只需要对集合进行正确的设置即可。
https://developer.apple.com/documentation/uikit/uicollectionview/1618092-reloadsections
https://developer.apple.com/documentation/uikit/uicollectionview/1618055-reloaditems
有一本很好的文章,介绍了如何精细地更新您的收藏夹视图https://medium.com/flawless-app-stories/a-better-way-to-update-uicollectionview-data-in-swift-with-diff-framework-924db158db86