gpt4 book ai didi

ios - UICollectionView didSelectItemAt 从不触发

转载 作者:行者123 更新时间:2023-11-28 14:31:02 25 4
gpt4 key购买 nike

在我的 VC 中,我有一个从底部拉起的 View 。我在 viewDidLoad() 中设置并添加了一个 UICollectionView:

//Add and setup the collectionView
collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: flowLayout)
collectionView?.register(PhotoCell.self, forCellWithReuseIdentifier: "photoCell")
collectionView?.delegate = self
collectionView?.dataSource = self
collectionView?.backgroundColor = #colorLiteral(red: 0.9771530032, green: 0.7062081099, blue: 0.1748393774, alpha: 1)
collectionView?.allowsMultipleSelection = false
collectionView?.allowsSelection = true
pullUpView.addSubview(collectionView!)
pullUpView.bringSubview(toFront: collectionView!)

UICollectionView Delegate 方法在扩展中,目前与 VC 在同一个代码文件中:

//MARK: - Extension CollectionView
extension MapVC: UICollectionViewDelegate, UICollectionViewDataSource {
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return imagesArray.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "photoCell", for: indexPath) as? PhotoCell {
let imageFromIndex = imagesArray[indexPath.item]
let imageView = UIImageView(image: imageFromIndex )
cell.addSubview(imageView)
return cell
} else {
return PhotoCell()
}
}


func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print("selected")
//Create PopVC instance, using storyboard id set in storyboard
guard let popVC = storyboard?.instantiateViewController(withIdentifier: "popVC") as? PopVC else { return }
popVC.passedImage = imagesArray[indexPath.row]
present(popVC, animated: true, completion: nil)
}

}

问题是当我点击一个单元格时没有任何反应。我在 didSelectItemAt 方法中放置了一个 print 语句,但它永远不会被打印出来。因此,我的单元格永远不会被选中,或者至少永远不会触发 didSelectItemAt 方法!

调试和尝试了几个小时,我看不出哪里出了问题。任何帮助表示赞赏。如果允许的话,也许有人可以从 Github 打开 mijn 项目看看有什么问题?

更新:使用 Debug View Hierarchy,我看到了一些令人不安的东西:每个 photoCell 都有多个(很多!)UIImageView。我认为每个 photoCell 应该只有一个 UIImageView。我不知道是什么导致了这种行为?

Debug View Hierarchy

最佳答案

我检查了你的代码,有几个问题:

首先,您必须更改您的 PhotoCell 实现,并仅在创建单元格时将您的 imageView 添加到类中。您的单元格未加载 XIB,因此您必须在 init(frame:) 中添加 imageView:

class PhotoCell: UICollectionViewCell {

var photoImageView: UIImageView!

override init(frame: CGRect) {
super.init(frame: frame)
setupCell()
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

private func setupCell() {
photoImageView = UIImageView()
addSubview(photoImageView)
}

override func layoutSubviews() {
super.layoutSubviews()
photoImageView.frame = bounds // ensure that imageView size is the same of the cell itself
}

}

此更改后,在 cellForItem 方法中,您可以执行 cell.photoImageView.image = imageFromIndex

没有调用 didSelect 的问题是由于您的 pullUpView 始终具有 height = 1,即使您能够看到 collectionView,它也不会收到任何触摸。

  • 首先在你的MapVc中添加一个pullUpView高度约束的IBOutlet
  • 创建 Collection View 时,确保 Collection View 的大小与 pullUpView 的大小相同,以便能够滚动; collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: 300), collectionViewLayout: flowLayout)

然后将animateViewUpanimateViewDown改成这样

func animateViewUp() {
mapViewBottomConstraint.constant = 300
pullUpViewHeightConstraint.constant = 300 // this will increase the height of pullUpView
UIView.animate(withDuration: 0.5) {
self.view.layoutIfNeeded()
}
}
@objc func animateViewDown() {
cancelAllSessions()

//remove previous loaded images and urls
imagesArray.removeAll()
imageUrlsArray.removeAll()

mapViewBottomConstraint.constant = 0
pullUpViewHeightConstraint.constant = 0 // this will reset height to 0
UIView.animate(withDuration: 0.5) {
self.view.layoutIfNeeded()
}
}

通过执行所有这些操作,向下滑动手势将不再有效,因为触摸被 Collection View 拦截和处理,您应该手动处理。

但是我建议您更改在线类(class),此代码有很多我不喜欢的地方。

关于ios - UICollectionView didSelectItemAt 从不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51263019/

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