我有一个习惯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];
}
Run Code Online (Sandbox Code Playgroud)
哪个大多数工作正常.除此之外,当我双击视图时,选择状态会更改并弹出窗口.这不是我想要的.
看来我有两个选择.我可以在响应双击时恢复选择状态(撤消错误的单击)或者我可以尝试某种NSTimer解决方案以在响应单击之前构建延迟.换句话说,我可以确保在更改选择状态之前没有第二次单击.
这似乎更优雅,所以这是我最初采用的方法.我从谷歌找到的唯一真正指导是在一个未命名的网站上,其名称中带有连字符.这种方法主要适用于一个重要的警告.
突出的问题是"我NSTimer要等多久?".未命名的网站建议使用Carbon功能GetDblTime().除了在64位应用程序中无法使用之外,我能找到的唯一文档说它正在返回时钟滴答.我不知道如何将它们转换为秒NSTimer.
那么这里的"正确"答案是什么?摸索着GetDblTime()?双击"撤消"选择?我无法弄清楚可可惯用法.
我有一个绑定到NSArrayController的NSCollectionView.我想让拖放工作,所以我创建一个委托并实现方法
-(BOOL)collectionView:(NSCollectionView *)collectionView canDragItemsAtIndexes:(NSIndexSet *)indexes withEvent:(NSEvent*)event
-(BOOL)collectionView:(NSCollectionView *)collectionView acceptDrop:(id < NSDraggingInfo >)draggingInfo index:(NSInteger)index dropOperation:(NSCollectionViewDropOperation)dropOperation
-(NSDragOperation)collectionView:(NSCollectionView *)collectionView validateDrop:(id < NSDraggingInfo >)draggingInfo proposedIndex:(NSInteger *)proposedDropIndex dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation
-(NSArray *)collectionView:(NSCollectionView *)collectionView namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropURL forDraggedItemsAtIndexes:(NSIndexSet *)indexes
Run Code Online (Sandbox Code Playgroud)
我为两个BOOL方法返回YES,为validateDrop:方法返回NSDragOperationMove,为namesOfPromisedFilesDroppedAtDestination:方法返回一个空数组.我还有一个NSLog语句作为每个方法的第一行,所以我可以看到它们何时被调用.
现在,唯一被调用的方法是canDragItemsAtIndexes :(其中我返回YES).我看到它被调用,但任何进一步的拖动只会修改选择.其余的从未被召唤过.
如果我使NSCollectionView不支持选择,那么甚至不会调用该方法.
我敢肯定我错过了一些非常明显的东西,但我无法弄清楚它是什么.有没有人使用NSCollectionViews进行拖放工作并且可以解决一些问题?
我有一个硬件,我试图通过计算机的内置 SPI 驱动程序来控制它。SPI 驱动程序通过 ioctl 进行控制。
我可以通过一个小的C程序成功地驱动硬件;但是当我尝试在 Ruby 中复制 C 程序时,我遇到了问题。
使用IO#ioctl设置基本寄存器(使用 u32 和 u8 ints)效果很好(我知道,因为我还可以使用 ioctl 读回我设置的值);但一旦我尝试设置一个复杂的结构,程序就会失败
small.rb:51:in 'ioctl': Connection timed out @ rb_ioctl - /dev/spidev32766.0 (Errno::ETIMEDOUT)
Run Code Online (Sandbox Code Playgroud)
我可能会遇到麻烦,因为spi_ioc_transfer 结构有两个指向字节缓冲区的指针,但即使在 32 位平台上,这些指针也被键入为无符号 64 位整数 - 需要(unsigned long)在 C 中进行强制转换。我正在尝试在 C 中复制它Ruby 但我对自己很不确定。
下面是可以运行的 C 程序和不能运行的 Ruby 端口。这些do_latch功能是必要的,以便我可以在我的硬件中看到结果;但可能与这个问题没有密切关系。
C(有效):
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
int do_latch() {
int fd = open("/sys/class/gpio/gpio1014/value", O_RDWR); …Run Code Online (Sandbox Code Playgroud)