Cocoa - 如何区分 NSTableView 内的单击和滚动(连续按下向上/向下键)

标签 cocoa delegates click nstableview nsevent

我想在 NSTableView 中选择特定记录时触发查询,而不是当用户通过连续按向上/向下按钮向下滚动或向上滚动以到达记录时触发查询。

我当前的实现是

if ([notification object] == myTableView)
    {
        if ([myTableView selectedRow] >= 0) {
            myCont = [[MyController alloc] init];
            if([[detailsView subviews]count]>0)
                [detailsView removeAllSubviews];
            NSRect frameRect = [[scDetailsViewController view] frame];
            frameRect.size.height = [detailsView frame].size.height;
            frameRect.size.width = [detailsView frame].size.width;
            [[myCont view] setFrame:frameRect];
            [detailsView addSubview:[myCont view]];
//Firing the Query
            [myCont populateDetails :[[self myList] entityAt:[myTableView selectedRow]]];
        }
}

但是通过这种方式,即使长时间按下向上/向下按键,查询也会被触发,这是不符合预期的。

有什么方法可以像邮件应用程序一样区分 NSTableView 中的单击和滚动(连续按下向上/向下键)。

最佳答案

刚刚在 tableViewSelectionDidChange 方法中编写了以下代码,几乎可以完美运行。

- (void)tableViewSelectionDidChange:(NSNotification *)notification
{
    if ([notification object] == myTableView)
    {
        NSTimeInterval delayInterval = 0.0;
        NSEvent *event = [NSApp currentEvent];
        if(event != nil && [event type] == NSKeyDown && [event isARepeat])
        {
            NSLog(@"Long press of UP and DOWn arrow key.");
            delayInterval = [NSEvent keyRepeatInterval] + 0.01;
        }
        [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil];
        [self performSelector:@selector(myMethod) withObject:nil afterDelay:delayInterval];
    }
    else
    {
        if ([[detailsView subviews] count]>0)
        {
            [detailsView removeAllSubviews];
        }
    }
}

还编写了在另一个方法 myMethod 中触发查询的代码,该方法在上面的 performSelector 中被调用。

-(void) myMethod
{
    if ([scenarioTableView selectedRow] >= 0) {
        NSLog(@"Normal selection on table view row.");
        scDetailsViewController = [[ScenarioDetailsViewController alloc] init];
        if([[detailsView subviews]count]>0)
            [detailsView removeAllSubviews];
        NSRect frameRect = [[scDetailsViewController view] frame];
        frameRect.size.height = [detailsView frame].size.height;
        frameRect.size.width = [detailsView frame].size.width;
        [[scDetailsViewController view] setFrame:frameRect];
        [detailsView addSubview:[scDetailsViewController view]];
        [scDetailsViewController populateScenarioDetails :[[self scenarioDetailsList] entityAt:[scenarioTableView selectedRow]]];
    }
    else {
        if ([[detailsView subviews] count]>0)
        {
            [detailsView removeAllSubviews];
        }
    }
}

关于Cocoa - 如何区分 NSTableView 内的单击和滚动(连续按下向上/向下键),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19241005/

相关文章:

cocoa - 无法在支持 AppleScript 的 Core-data 应用程序中使用来自“新建”命令的引用

cocoa - 为什么引发 NSException 不会导致我的应用程序崩溃?

c# - 如何将苹果委托(delegate)添加到水果委托(delegate)列表中?

jquery - iOS 上的点击事件将不起作用,除非点击图像时......为什么?

javascript - jquery:如何禁用 dblclick 事件?

java - Selenium Webdriver click()没有做任何事情

objective-c - 将接口(interface)传递给对象,还是在 Cocoa 中使用委托(delegate)?

objective-c - 如何在 Cocoa 中进行异步 Web 服务调用

ios - Controller 之间通过自定义委托(delegate)进行通信

cocoa - 在构造函数中传递 Controller 总是不好的做法吗?