我的 NSCollectionView 项目集成了另一个 NSCollectionView。一切都很好,但在第一个 View 中选择项目时就不行了。
当我设置collectionView1.isSelectable = true
时,仅当我单击第二个(集成)collectionView以外的其他位置时才会调用didSelectItemsAt
委托(delegate)。更清楚地说,如果我单击标签、图像或自定义 View :它就会起作用。一旦我单击第二个 Collection View ,就不会调用委托(delegate)。
这是我迄今为止尝试过的:
- Sẽ
collectionView2.isSelectable = true
设置为第二个 View 。但这不起作用。
- 我关注了 this tip .奇怪的是这也不起作用。我也有同样的行为。
- 唯一有效的方法是在每个集成 Collection View 上添加手势识别器。但这太丑了...
我还没有在 iOS 上尝试过 UICollectionView 和单元格选择,但我倾向于认为问题是相同的。
biên tập:
因此,如果我单击绿色标签或蓝色部分(这是第一个 Collection View 项)上的任何位置,则将正确调用 didSelectItemsAt
委托(delegate)。如果我点击橙色的 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) {
print("I can't make this work!")
}
}
对于第二个 Collection View :
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
项目在这个单元格中。
hãy nhìn xem NSCollectionViewDelegate
của collectionView(_:shouldSelectItemsAt:)
来自文档:
Return Value
The set of NSIndexPath objects corresponding to the items that you want to be selected. If you do not want any items selected, return an empty set.
Tôi là một lập trình viên xuất sắc, rất giỏi!