ios - 如果项目集成了另一个 CollectionView,则无法选择 CollectionView 项目
问题描述
我的 NSCollectionView 项目集成了另一个 NSCollectionView。一切都很好,但在第一个视图中选择项目时就不行了。
当我设置collectionView1.isSelectable = true
时,didSelectItemsAt
只有当我单击第二个(集成的)collectionView 之外的其他位置时,才会调用委托。更清楚地说,如果我单击标签、图像或自定义视图:它可以工作。一旦我单击第二个集合视图,就不会调用委托。
这是我到目前为止所尝试的:
- 设置
collectionView2.isSelectable = true
为第二个视图。那没有用。 - 我遵循了这个提示。奇怪的是,这也不起作用。我有同样的行为。
- 唯一可行的方法是在每个集成的集合视图上添加一个手势识别器。但这太丑了……
我还没有在 iOS 上尝试过使用 UICollectionView 和单元格选择,但我倾向于认为问题是一样的。
编辑:
因此,如果我单击绿色标签或蓝色部分(这是第一个集合视图项)上的任何位置,则didSelectItemsAt
代表被正确调用。如果我点击橙色的 NSView(里面有第二个 CollectionView),它就不会被调用..
下面是第一个 CollectionView 的简化代码:
class DashboardVC: NSViewController {
@IBOutlet weak var collectionView1: NSCollectionView!
override func viewDidLoad() {
super.viewDidLoad()
self.initViews()
}
fileprivate func initViews() {
let flowLayout = NSCollectionViewFlowLayout()
flowLayout.itemSize = NSSize(width: 400.0, height: 380.0)
flowLayout.sectionInset = NSEdgeInsets(top: 20.0, left: 20.0, bottom: 20.0, right: 20.0)
flowLayout.minimumInteritemSpacing = 20.0
flowLayout.minimumLineSpacing = 20.0
self.collectionView1.collectionViewLayout = flowLayout
self.collectionView1.isSelectable = true
self.collectionView1.dataSource = self
self.collectionView1.delegate = self
}
}
extension DashboardVC: NSCollectionViewDataSource {
func numberOfSections(in collectionView: NSCollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {
return 5
}
func collectionView(_ itemForRepresentedObjectAtcollectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
let item = self.collectionView1.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "CollectionViewItem"), for: indexPath)
guard let collectionViewItem = item as? CollectionViewItem else { return item }
return collectionViewItem
}
}
extension DashboardVC: NSCollectionViewDelegate {
func collectionView(_ collectionView: NSCollectionView, didSelectItemsAt indexPaths: Set<IndexPath>) {
print("I can't make this work!")
}
}
对于第二个集合视图:
class TabularView: NSView {
lazy var collectionView2: NSCollectionView = {
let gridLayout = NSCollectionViewGridLayout()
gridLayout.maximumNumberOfColumns = self.numberOfColums
gridLayout.maximumNumberOfRows = self.numberOfRows
let collectionView = NSCollectionView(frame: .zero)
collectionView.collectionViewLayout = gridLayout
collectionView.translatesAutoresizingMaskIntoConstraints = false
collectionView.isSelectable = true //-> does not work :(
collectionView.dataSource = self
collectionView.delegate = self
return collectionView
}()
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
self.setup()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
self.setup()
}
private func setup() {
self.addSubview(self.collectionView)
NSLayoutConstraint.activate([
self.topAnchor.constraint(equalTo: self.collectionView.topAnchor),
self.bottomAnchor.constraint(equalTo: self.collectionView.bottomAnchor),
self.leadingAnchor.constraint(equalTo: self.collectionView.leadingAnchor),
self.trailingAnchor.constraint(equalTo: self.collectionView.trailingAnchor),
])
}
}
extension TabularView: NSCollectionViewDataSource {
func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {
return self.numberOfRows * self.numberOfColums
}
func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
let item = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "TabularCollectionViewItem"), for: indexPath)
guard let collectionViewItem = item as? TabularCollectionViewItem else { return item }
return collectionViewItem
}
}
解决方案
如果我正确理解了您的问题,您正在尝试禁用对特定项目的collectionView1
选择,而是让用户选择collectionView2
嵌入在此单元格中的项目。
看看NSCollectionViewDelegate
_collectionView(_:shouldSelectItemsAt:)
从文档中:
返回值
与您要选择的项目相对应的 NSIndexPath 对象集。如果您不想选择任何项目,请返回一个空集。
推荐阅读
- java - 未找到 GitLab CI 主方法上的 Gradle 任务失败
- django - 将 .csv 文件导入 PostgreSQL 并在第一列添加自动递增 ID
- swift - 如何从 Firestore 中检索一个值以更改每个侦听项的表格单元格中按钮的文本?
- complex-event-processing - Cumulocity CEP 事件查询取决于其他事件
- squarespace - 创建 squarespace 隐藏表单
- java - 在 Android Studio 中打开 Eclipse Android maven 项目
- jquery - 用 JQuery 的图像替换图像的链接
- android - 如何从 Firestore 存储和获取时间?
- java - 如何显示数组中小于 3 的数字
- android - 目标 API 级别为 29 的 AndroidQ 不需要 WRITE_EXTERNAL_STORAGE 权限,它会破坏安全性吗?