1

NSTableView で特定のレコードが選択されたときにクエリを起動したいのですが、ユーザーがスクロールダウンまたはスクロールアップして UP/DOWN ボタンを押し続けてレコードに到達したときではありません。

私の現在の実装は

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]]];
        }
}

ただし、この方法では、意図しない長い UP/DOWN プレスが行われた場合でも、クエリが起動されます。

メール アプリケーションのように、NSTableView 内でクリックとスクロール (UP/DOWN キーを押し続けること) を区別する方法はありますか。

4

2 に答える 2

0

メソッドに以下のコードを記述しただけで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];
        }
    }
}
于 2013-10-08T10:26:46.323 に答える