【发布时间】:2009-11-03 02:40:40
【问题描述】:
我有一个自定义的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];
}
大部分工作正常。除了,当我双击视图时,选择状态会改变并且窗口会弹出。这不正是我想要的。
看来我有两个选择。我可以在响应双击时恢复选择状态(撤消错误的单击),或者我可以使用某种NSTimer 解决方案在响应单击之前建立延迟。换句话说,我可以确保在更改选择状态之前不会再次单击。
这看起来更优雅,所以这是我一开始采用的方法。我从 Google 中找到的唯一真正的指导是在一个名称中带有连字符的未命名网站上。这种方法主要适用于一个很大的警告。
悬而未决的问题是“我的NSTimer 应该等待多长时间?”。未命名的站点建议使用 Carbon 函数GetDblTime()。除了在 64 位应用程序中无法使用之外,我能找到的唯一文档说它正在返回时钟滴答声。而且我不知道如何将这些转换为NSTimer 的秒数。
那么这里的“正确”答案是什么?摸索GetDblTime()?双击“撤消”选择?我无法弄清楚 Cocoa 惯用的方法。
【问题讨论】:
-
在您检查 [model hasBeenDownloaded] 之后,我只需将 [model setIsSelected:NO] 添加到块中。
-
是的,这就是我现在正在做的事情。这是我的第一个大型 Cocoa 应用程序,所以我试图找出适合这种情况的最佳实践。谷歌帮助不大,所以我认为 Stack Overflow 问题比较合适。