小编Jam*_*ams的帖子

区分单击与Mac上的Cocoa双击

我有一个习惯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()?双击"撤消"选择?我无法弄清楚可可惯用法.

mouse cocoa nsview

17
推荐指数
2
解决办法
8791
查看次数

NSCollectionView拖放:大多数代表事件未被调用

我有一个绑定到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进行拖放工作并且可以解决一些问题?

macos cocoa drag-and-drop objective-c nscollectionview

6
推荐指数
1
解决办法
5251
查看次数

Ruby、ioctl 和复杂结构

我有一个硬件,我试图通过计算机的内置 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)

c ruby

5
推荐指数
1
解决办法
608
查看次数

标签 统计

cocoa ×2

c ×1

drag-and-drop ×1

macos ×1

mouse ×1

nscollectionview ×1

nsview ×1

objective-c ×1

ruby ×1