我有一个习惯NSView
(这是其中之一,他们都住在一个NSCollectionView
— 我认为这不相关,但谁知道呢)。当我单击视图时,我希望它更改其选择状态(并相应地重新绘制自身);当我双击视图时,我希望它为刚刚双击的对象弹出一个更大的预览窗口。
我的第一个看起来像这样:
- (void)mouseUp: (NSEvent *)theEvent {
if ([theEvent clickCount] == 1) [model setIsSelected: ![model isSelected]];
else if ([theEvent clickCount] == 2) if ([model hasBeenDownloaded]) [mainWindowController showPreviewWindowForPicture:model];
}
这大部分工作得很好。除了,当我双击视图时,选择状态会发生变化and窗口弹出。这不正是我想要的。
看来我有两个选择。我可以在响应双击时恢复选择状态(撤消错误的单击),或者我可以欺骗某种NSTimer
解决方案是在响应单击之前建立延迟。换句话说,我可以确保在更改选择状态之前不会发生第二次单击。
这看起来更优雅,所以这是我一开始采取的方法。我从谷歌找到的唯一真正的指导是在一个名称中带有连字符的未命名网站上。这种方法大多有效,但有一个很大的警告。
悬而未决的问题是“我应该多长时间NSTimer
等等?”。未命名的网站建议使用 Carbon 函数GetDblTime()
。除了在 64 位应用程序中无法使用之外,我能找到的唯一文档表明它正在返回时钟滴答声。我不知道如何将它们转换为秒NSTimer
.
那么这里的“正确”答案是什么?摸索着GetDblTime()
?双击“撤消”选择?我无法弄清楚可可惯用的方法。
延迟选择状态的更改是(据我所知)推荐的方法。
实现起来非常简单:
- (void)mouseUp:(NSEvent *)theEvent
{
if([theEvent clickCount] == 1) {
[model performSelector:@selector(toggleSelectedState) afterDelay:[NSEvent doubleClickInterval]];
}
else if([theEvent clickCount] == 2)
{
if([model hasBeenDownloaded])
{
[NSRunLoop cancelPreviousPerformRequestsWithTarget: model];
[mainWindowController showPreviewWindowForPicture:model];
}
}
}
(请注意,在 10.6 中,双击间隔可以作为类方法访问NSEvent
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)