我正在尝试让我的程序识别出使用NSCollectionView进行双击.我尝试过这个指南:http://www.springenwerk.com/2009/12/double-click-and-nscollectionview.html但是当我这样做时,没有任何反应,因为IconViewBox中的委托是null:
h文件:
@interface IconViewBox : NSBox
{
IBOutlet id delegate;
}
@end
Run Code Online (Sandbox Code Playgroud)
m文件:
@implementation IconViewBox
-(void)mouseDown:(NSEvent *)theEvent {
[super mouseDown:theEvent];
// check for click count above one, which we assume means it's a double click
if([theEvent clickCount] > 1) {
NSLog(@"double click!");
if(delegate && [delegate respondsToSelector:@selector(doubleClick:)]) {
NSLog(@"Runs through here");
[delegate performSelector:@selector(doubleClick:) withObject:self];
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二个NSLog永远不会被打印,因为委托是空的.我已经连接了我的nib文件中的所有内容并按照说明操作.有谁知道为什么或替代为什么这样做?
我已成功创建了一个NSCollectionView,并在IB中的视图原型中添加了一个标签,绑定到我所代表的对象的属性.我现在想以编程方式创建一个NSButton和NSTextField,其中NSTextField绑定到我表示的对象的属性.单击按钮时,我想显示并隐藏NSTextField.
我遇到的问题是,如果我在视图的initWithCoder方法中为控件添加初始化代码,并且在视图的awakeFromNib中绑定,则绑定不会被连接起来.如果我将我的控件的初始化放在awakeFromNib中,当单击该按钮时,我无法访问视图中的控件(使用NSLog打印时它们为null).
从我可以告诉它看起来问题可能是NSCollectionView的工作方式是,它创建了一个视图实例,然后复制它以了解集合视图中的每个对象的方式.如何获取初始化按钮和绑定以使用原型的副本?
下面是我的初始化代码和我在子类视图的awakeFromNib中的绑定:
SubView.h
@interface SubView : NSView {
NSButton *button;
NSTextField *textField;
IBOutlet NSCollectionViewItem *item; // Connected in IB to my NSCollectionViewItem
}
- (IBAction)buttonClicked:(id)sender;
@end
Run Code Online (Sandbox Code Playgroud)
SubView.m
@implementation SubView
- (id)initWithCoder:(NSCoder *)decoder
{
id view = [super initWithCoder:decoder];
button = [[NSButton alloc] initWithFrame:NSMakeRect(50, 95, 100, 20)];
[button setTitle:@"Begin Editing"];
[button setTarget:self];
[button setAction:@selector(buttonClicked:)];
[self addSubview:button];
textField = [[NSTextField alloc] initWithFrame:NSMakeRect(10, 10, 100, 75)];
[self addSubview:textField];
return(view);
}
- (void)awakeFromNib
{
// Bind the textField to the representedObject's name …Run Code Online (Sandbox Code Playgroud) 我已经将NSCollectionView子类化了,我正试图从Finder接收拖动的文件.我正在接收draggingEntered:并返回一个合适的值,但我从未接收过prepareForDragOperation:(在此过程中也没有接收过任何方法).有什么明显的东西我在这里不见了吗?
码:
- (void)awakeFromNib
{
[self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
}
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
{
NSLog(@"entered"); //Happens
NSPasteboard *pboard;
NSDragOperation sourceDragMask;
sourceDragMask = [sender draggingSourceOperationMask];
pboard = [sender draggingPasteboard];
if ([[pboard types] containsObject:NSFilenamesPboardType])
{
NSLog(@"copy"); //Happens
return NSDragOperationCopy;
}
return NSDragOperationNone;
}
- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender
{
NSLog(@"prepare"); //Never happens
return YES;
}
Run Code Online (Sandbox Code Playgroud) 和斯威夫特一起学习,我整天都在这里,但进展甚微:
需要知道何时选择NSCollectionView中的项目.最终目标是使项目突出显示,并能够使用删除键从集合中删除它.我的NSCollectionView绑定到ArrayController以获取内容并发送选择索引,因此看起来我需要观察ArrayController以进行选择更改,但是在那里看不到任何有用的委托方法.原型视图有一个文本字段.
我在这里和其他地方跟踪了obj-c示例(在Swift中没有找到),但是Swift NSCollectionViewItem没有要覆盖的setSelected方法.它有一个选定的财产.
如何在Swift中选择NSCollectionViewItem时获得通知?
所以我一直想用Swift为OSX编写一个需要Collection View的程序.就像OSX一样,它不使用UICollectionView而是使用NSCollectionView(顺便说一下,如果你知道任何使用Swift的教程,我们将非常感激!).
问题是:我在我的故事板中放了一个'Collection View',使它成为我的初始控制器,并且在创建视图时,它还在故事板上创建了一个NSCollectionViewItem.在Xcode 6中,原型项与故事板的任何其他元素完全无关,但现在在Xcode 7中,它是使用"Prototype Segue"创建的.
问题:当我编译时,我遇到了这个错误:
Unknown segue relationship : Prototype
Run Code Online (Sandbox Code Playgroud)
任何人都知道如何解决它?
在此先感谢,对不起我的英语 - '
我想根据https://developer.apple.com/library/mac/releasenotes/AppKit/RN-AppKit/#10_11CollectionView使用来自Swift的新API模型的NSCollectionView .由于我更喜欢在IB中尽可能多地做,我想使用内容绑定,并在链接页面上按照绑定内容部分到NSCollectionView(自WWDC种子以来新增).
我已经从对象库中将NSCollectionView拖入我的故事板,然后通过连接检查器删除了另外生成的原型 segue,并删除了生成的NSCollectionViewItem.然后,我将Collection View的布局设置为Flow,并将集合视图连接到视图控制器的插座.
接下来,我使用Xcode的视图模板创建了一个单独的.xib文件,并放入必要的视图.我还引入了"Collection View Item"对象.
然后,我调整了视图控制器的viewDidLoad方法,用集合视图注册nib.
override func viewDidLoad() {
super.viewDidLoad()
let nib = NSNib(nibNamed: "Item", bundle: nil)!
collectionView.registerNib(nib, forItemWithIdentifier: "")
}
Run Code Online (Sandbox Code Playgroud)
最后,我将我的数组控制器连接到NSCollectionView的Content绑定.
但是,当我尝试启动应用程序时,会抛出异常:
[NSNib _initWithNibNamed:bundle:options:]无法在bundle NSBundle中加载nibName:NSCollectionViewItem
仅当我的数组具有实际内容时才会发生异常,因此仅当需要实例化CollectionViewItem时.
我在这做错了什么?
我需要这样的东西:
但我的代码是这样做的:
func collectionView(collectionView: NSCollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> NSView {
let a = myView()
if kind == NSCollectionElementKindSectionHeader {
a.frame = NSMakeRect(0, 0, 1000, 10)
}
else if kind == NSCollectionElementKindSectionFooter {
a.frame = NSMakeRect(0, 0, 1000, 12)
}
return a
}
func numberOfSectionsInCollectionView(collectionView: NSCollectionView) -> Int {
return 3
}
override func numberOfItemsInSection(section: Int) -> Int {
if section == 0 {
return 5
}
else if section == 1 {
return 5
}
return …Run Code Online (Sandbox Code Playgroud) NSCollectionViewFlowLayout生成一个布局,其右边距上的项目对齐,或者,如果容器只有一个项目的宽度,则居中项目.我期待一个对齐选项,例如在委托上,但我没有在文档中找到任何内容.是否需要继承NSCollectionViewFlowLayout才能实现此目的?
我在这里有点迷失:我创建了一个像colorPicker一样的按钮:单击它会在弹出框中显示一个collectionView.我首先使用包含视图+ collectionView(嵌入在scrollView + clipView中)的nib fil.东西工作得很好.
由于nib文件非常简单(并且为了提高我在编程方式设计视图时的编码技巧),我决定摆脱nib文件并在代码中编写缺失的部分.问题是,我设法完成工作,除了collectionView的内容.经过深入调查,看来,方法内部:
func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem
Run Code Online (Sandbox Code Playgroud)
这应该是管理数据源的方法
collectionView.makeItem(withIdentifier: String, for: IndexPath)
Run Code Online (Sandbox Code Playgroud)
不起作用.事实上,在:
let item = collectionView.makeItem(withIdentifier: ColorPickerPopover.itemIdentifier, for: indexPath)
Run Code Online (Sandbox Code Playgroud)
item是未初始化的,正如调试器在我介入时说的那样(不是零,未初始化).显然,makeItem方法永远不会从我所创建的子类中实例化任何collectionViewItem.标识符很好,并且调用了collectionView.register函数,就像在nib版本中一样,因为这两个项目在这些点上是相同的.makeItem函数根本不调用我已经子类化的NSCollectionViewItem的loadView方法.
任何线索?
玩笑
我试图让 click-though 工作,以便我的应用程序即使在窗口处于非活动状态时也能响应鼠标点击。我有一个带有响应鼠标事件的 NSCollectionView 项目的 collectionView。我尝试将 collectViewItem 使用的视图子类化,并且还子类化了用于 NSCollectionView 的视图。它不起作用。子类视图的代码如下所示:
import Cocoa
class SubclassedView: NSView {
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
}
// adding this override should allow click-through so buttons can be clicked even with an inactive window
// it doesn't work
override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
print("got first mouse")
return true
}
override var acceptsFirstResponder :Bool {
get {
return true
}
}
}
Run Code Online (Sandbox Code Playgroud)
有谁知道这里出了什么问题?