didSelectItemAtIndexPath 未在同一屏幕上使用多个集合视图调用
didSelectItemAtIndexPath not called with multiple collection views on same screen
我在同一个屏幕上有 2 个集合视图,并且我在同一个视图控制器中为它们实现了数据源和委托。但是,didSelectItemAtIndexPath 等委托方法只调用了一个。
其他信息:
- 两个集合视图都有一个带有图像的单元格。
- AllowSelection 和 UserInteractionEnabled 在两个集合视图中都设置为 true
- 图像上启用了用户交互
- 委托和数据源在故事板上从两个集合视图设置到视图控制器
- 集合视图正确显示
两个集合视图具有相同的设置,但只有一个委托起作用。您能知道是什么设置了吗?
集合视图位于具有滚动视图的视图内。这会以某种方式相关吗?
编辑 2:
有相同问题的项目:https://github.com/iagomr/ProblemWithAutoLayout
编辑 1:
不知何故这与自动布局约束有关,因为如果我将底部集合视图固定到屏幕底部而不是其他集合视图的底部,它就会开始工作。
这都是因为我需要构建一个高屏幕,并将所有内容添加到 1000 点高的滚动视图中的视图中。
代码:
//MARK: - CollectionView Delegate
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
println("Called")
}
//MARK: - CollectionView DataSource
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if collectionView == thisCV {
return 1
} else if collectionView == thisOtherCV{
return 1
}
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
if collectionView == "thisCV" {
if let thisCell = collectionView.dequeueReusableCellWithReuseIdentifier("thisCell", forIndexPath: indexPath) as? thisCollectionViewCell {
thisCell.image = image
return thisCell
}
} else if collectionView == "thisOtherCV"{
if let thisOtherCell = collectionView.dequeueReusableCellWithReuseIdentifier("thisOtherCell", forIndexPath: indexPath) as? OtherCollectionViewCell {
thisOtherCell.image = image
return thisOtherCell
}
}
return UICollectionViewCell()
}
我可以确认 didSelectItem
没有被调用。如果将两个集合视图之间的上下约束常量从 501 更改为 0,它就可以正常工作。
这个问题很可能与您在另一个滚动视图中有两个滚动视图(集合视图)有关。总的来说,我会说,你应该修改你的 UI。我会建议两种修复方法
使用单一集合视图
只使用一个集合视图,其中包含针对不同内容的不同部分。另外,不要将它嵌入到滚动视图中——集合视图已经有一个滚动视图,所以你应该能够轻松滚动。您还可以为不同的部分出列不同的 class 单元格,这样您现在就可以做您想做的所有事情。
如果您想要一个起点,here 是一个很好的教程,应该可以帮助您。
使用滚动视图
如果您想在 Interface Builder 中设置您的 UI,请删除两个集合视图并简单地将所有 UI 添加到滚动视图中。将 UIButton
放在您希望点击产生动作的地方。
您甚至可以为每个按钮分配相同的操作,然后通过为每个按钮分配自定义标签来区分触发的是哪个。
我在同一个屏幕上有 2 个集合视图,并且我在同一个视图控制器中为它们实现了数据源和委托。但是,didSelectItemAtIndexPath 等委托方法只调用了一个。
其他信息:
- 两个集合视图都有一个带有图像的单元格。
- AllowSelection 和 UserInteractionEnabled 在两个集合视图中都设置为 true
- 图像上启用了用户交互
- 委托和数据源在故事板上从两个集合视图设置到视图控制器
- 集合视图正确显示
两个集合视图具有相同的设置,但只有一个委托起作用。您能知道是什么设置了吗?
集合视图位于具有滚动视图的视图内。这会以某种方式相关吗?
编辑 2:
有相同问题的项目:https://github.com/iagomr/ProblemWithAutoLayout
编辑 1:
不知何故这与自动布局约束有关,因为如果我将底部集合视图固定到屏幕底部而不是其他集合视图的底部,它就会开始工作。
这都是因为我需要构建一个高屏幕,并将所有内容添加到 1000 点高的滚动视图中的视图中。
代码:
//MARK: - CollectionView Delegate
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
println("Called")
}
//MARK: - CollectionView DataSource
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if collectionView == thisCV {
return 1
} else if collectionView == thisOtherCV{
return 1
}
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
if collectionView == "thisCV" {
if let thisCell = collectionView.dequeueReusableCellWithReuseIdentifier("thisCell", forIndexPath: indexPath) as? thisCollectionViewCell {
thisCell.image = image
return thisCell
}
} else if collectionView == "thisOtherCV"{
if let thisOtherCell = collectionView.dequeueReusableCellWithReuseIdentifier("thisOtherCell", forIndexPath: indexPath) as? OtherCollectionViewCell {
thisOtherCell.image = image
return thisOtherCell
}
}
return UICollectionViewCell()
}
我可以确认 didSelectItem
没有被调用。如果将两个集合视图之间的上下约束常量从 501 更改为 0,它就可以正常工作。
这个问题很可能与您在另一个滚动视图中有两个滚动视图(集合视图)有关。总的来说,我会说,你应该修改你的 UI。我会建议两种修复方法
使用单一集合视图
只使用一个集合视图,其中包含针对不同内容的不同部分。另外,不要将它嵌入到滚动视图中——集合视图已经有一个滚动视图,所以你应该能够轻松滚动。您还可以为不同的部分出列不同的 class 单元格,这样您现在就可以做您想做的所有事情。
如果您想要一个起点,here 是一个很好的教程,应该可以帮助您。
使用滚动视图
如果您想在 Interface Builder 中设置您的 UI,请删除两个集合视图并简单地将所有 UI 添加到滚动视图中。将 UIButton
放在您希望点击产生动作的地方。
您甚至可以为每个按钮分配相同的操作,然后通过为每个按钮分配自定义标签来区分触发的是哪个。