问题标签 [nscollectionviewitem]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - NSCollectionView 单元格顺序在视图更改时更改
我有一个包含标签栏设计的 macOS 应用程序(即:Tweetbot)。有 4 个选项卡链接到 4 个不同的视图控制器。初始视图控制器(视图一)包含NSCollectionView
水平显示 3 个单元格的 a。
这一切都很好,但是当我切换到另一个视图控制器然后返回到初始视图控制器时,集合视图的顺序会无缘无故地发生变化。我没有对数据源(即 a NSMutableArray
)进行任何更改,也没有添加/删除任何单元格,也没有调用reloadData
. 我不明白为什么集合视图单元格的顺序不断变化。
我已经做了一些测试,可以确认我的数据源中的数据顺序完全没有改变。所以对于集合视图来说,仅仅改变单元格的顺序是没有意义的。
我注意到的另一个奇怪问题是,如果我将集合视图限制为 2 个单元格,则不会发生此问题。这让我想知道问题是否归结为某种NSCollectionView
在后台运行的缓存方法?也许当集合视图回收一个单元格时,它使用了不正确的数据?
我尝试了很多不同的解决方案,似乎没有任何效果。有没有人知道我可以测试/尝试什么,以找出问题所在?
另类的想法
我可以NSTableView
改用,因为它支持多列(与 不同UITableView
)。所以我可以NSTableView
用 3 列做一个。这种方法在性能方面会比 a 更差NSCollectionView
(特别是如果我想添加很多单元格?)。
谢谢你的时间,丹。
swift - NSCollectionView renders all NSCollectionViewItems at the same point
I am trying to create a simple NSCollectionView
programmatically. I am setting it up in the NSViewController
:
Here's how I am setting up the NSCollectionViewItem
:
And here's how I'm creating a custom NSView
to work inside the NSCollectionViewItem
:
Now, despite the fact that I am using an NSCollectionViewFlowLayout
, conforming to the NSCollectionViewDelegateFlowLayout
and providing a sizeForItemAt
all indices, the resultant CollectionViewItemView
is always sized 0, as shown below:
In sample projects online, the authors always feed an NSZeroRect
to the frame of the NSCollectionViewItem
. If I give it a custom NSRect
, it always renders them on top of each other (since the origin of the frame is always the same).
What is the proper way of doing this? I'm at a loss. Why is the NSCollectionView
not responding to the NSCollectionViewDelegateFlowLayout
?
cocoa - 从项目内部拖动选择 NSCollectionView
我有一系列在 NSCollectionView 中展示的项目。选择和多选都启用。
用户可以通过拖动选择项目(即通过拖动标记项目)。但是,当用户开始从集合视图背景或项目之间的空间(而不是项目上)拖动时,这有效,但我希望在项目上开始拖动时也可以。
如果我们将文本和图像视为单个项目,我想要类似这张照片的东西。
图片来源: http: //osxdaily.com/2013/09/16/select-multiple-files-mac-os-x/
先感谢您。
macos - 如何从 NSCollectionView 中拖动项目
我正在尝试实现从NSCollectionView 拖动项目(不仅仅是在其上放置东西)。
在我的示例代码中,我正在通过拖动注册 CollectionView:
然后,我从 NSCollectionViewDelegate 协议中实现了这些方法:
但他们甚至都没有被调用过!为什么不?
如果我添加这两种方法:
然后我可以成功地将文件从桌面拖放到集合视图中,但反过来仍然不行。
这是怎么回事?
最好的问候,V。
macos - 无法拖动到 NSCollectionViewItem 中的图像上
我正在设计一个类似于 Finder 的文件夹浏览器应用程序。我想让用户能够从应用程序外部拖动文件并将它们拖放到我的应用程序内的文件夹中,从而将拖动的项目添加到该文件夹中。
我的自定义NSCollectionViewItem
对象 ,ArchiveCollectionViewItem
由单个NSImageView
和一个NSTextField
. 图像视图连接到ArchiveCollectionViewItem
的 imageView 出口,文本字段连接到 textField 出口。
在collectionView:itemForRepresentedObjectAtIndexPath:
中,我找到一个与 NSCollectionViewItem 对应的项目并显示它:
ArchiveCollectionViewItem
的 setArchiveItemViewModel 方法如下:
一切都按预期工作,除非将项目拖到ArchiveCollectionViewItem
' 的图像上。当我将一个项目拖到我的非图像部分时ArchiveCollectionViewItem
,我得到一个绿色的加号,表示一个有效的放置:
但是,当我将项目拖到图像部分时,绿色加号消失了。此外,collectionView:validateDrop:proposedIndexPath:dropOperation:
不会被调用:
我应该怎么做才能让整个ArchiveCollectionViewItem
视图接受下降?或者这是不可能/不允许的?
大多数其他NSCollectionView
拖放问题侧重于在应用程序内拖放(重新排列)或从应用程序内部拖放到应用程序外部。需要明确的是,这些都不是我的用例。我还没有找到与我类似的另一个 SO 问题(到目前为止),所以如果存在,请接受我的道歉并将我链接到它。
swift - 背景颜色变化不可见
在我的NSCollectionViewItem
我设置了一个 mouseDown 函数,它setSelected()
在视图中调用一个函数。
如您所见,在 completionHandler 中,我随后调用委托并告诉它已选择了一个单元格。然后在该委托函数中取消选择该行。
此代码有效,但在执行时,它几乎立即执行,使 backgroundColor 更改不可见。我怎样才能动画这个?还是放慢速度?或者还有其他解决方案吗?
swift - 无法让 NSCollectionView NSCollectionViewItem 工作
我已经按照下面的代码设置了所有内容,但由于某种原因我无法通过
守卫总是返回项目,而不是 collectionViewItem。也许有人遇到过这样的问题?我究竟做错了什么?几乎一直在关注教程https://www.raywenderlich.com/1246-collection-views-in-os-x-tutorial。
使用最新的 Xcode 10.0 + 最新的 swift
macos - 在自定义 NSCollectionViewLayout 子类上未调用 invalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)
描述
我正在尝试创建一个自定义NSCollectionViewLayout
子类,该子类使用自动布局来确定其项目的大小。这种布局从上到下定位项目,其中所有项目共享相同的宽度,但每个项目的高度由其内容决定。将其视为UITableView
macOS 的布局。
假设
初始布局属性在布局的prepare()
方法中计算,并通过 layoutAttributesForElements(in:)
. 集合视图使用这些属性来确定需要显示哪些项目。这些项目由集合视图的委托提供,并apply(_:)
调用每个项目的方法来设置其视图属性。
然后集合视图将调用项目的preferredLayoutAttributesFitting(_:)
方法来计算其内容的合适大小。然后返回的属性将被传递到集合视图布局的shouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:)
方法中,其中布局确定是否需要进行调整以响应新属性,并将该布尔决策返回给集合视图。
如果布局决定它需要失效,然后集合视图将调用invalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)
以从布局中获取特定信息,以了解它应该如何自我更新。然后当集合视图调用invalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)
时,布局可以应用这些更改。
然后重复这个过程,直到shouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:)
返回false
每个布局项——提示集合视图在屏幕上显示这些项。
前提
的ListLayout
子类NSCollectionViewLayout
能够为每个NSCollectionViewItem
具有“估计”初始高度的10
点创建一组初始布局属性。我们期望使用自动布局来确定每个项目的实际高度,所以这个初始值应该无关紧要。
然后,布局能够通过 提供正确的这些初始属性集layoutAttributesForElements(in:)
。
的TextFieldItem
子类NSCollectionViewItem
包含一个NSTextField
实例,该实例同时设置为它的view
和textField
属性。此视图的translatesAutoresizingMaskIntoConstraints
属性设置为 false,并且具有所需的垂直内容压缩阻力优先级。覆盖项目的apply(_:)
方法以将文本字段preferredMaxLayoutWidth
设置为给定属性提供的宽度。覆盖项的preferredLayoutAttributesFitting(_:)
方法以将首选属性的高度设置为等于文本字段的intrinsicContentSize
属性。
集合视图提供了TextFieldItem
填充多行文本的实例。
预计每个方法TextFieldItem
都会在其preferredLayoutAttributesFitting(_:)
方法之后apply(_:)
调用,然后调用布局shouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:)
和invalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)
方法。
但是,在操场运行时,都不会调用preferredLayoutAttributesFitting(_:)
, nor shouldInvalidateLayout(forPreferredLayoutAttributes:withOriginalAttributes:)
, nor 。invalidationContext(forPreferredLayoutAttributes:withOriginalAttributes:)
结果,每个项目的高度都保持在最初的“估计”高度。
问题
一定有我遗漏的东西NSCollectionViewLayout
和自动布局,但我在文档中没有找到任何表明这一点的东西。
我尝试在集合视图生命周期的各个不同点手动调用这些方法,但没有任何方法能够正确触发布局以调整其计算属性。
是否需要在集合视图、其布局或指示preferredLayoutAttributesFitting(_:)
应调用的项目上设置属性?自动布局是否仅支持 和 的子NSCollectionViewFlowLayout
类NSCollectionViewGridLayout
?还是我误解了NSCollectionViewLayout
实例的生命周期?
swift - 加载 NSCollectionViewItem 时出错
当我尝试加载 NSCollectionviewItem 时出现以下错误:collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath)
错误 :
无法为“CollectionViewCell”包中的 nib 实例化 NSViewController,因为包尚未加载
我正在从 xib 加载 CollectionViewItem
在 viewDidLoad 中编写以下代码