2

在我Browser选择默认行的实现中,我使用了以下代码。

[browser setTarget:self];
[browser setAction:@selector(singleClickOnBrowser:)];
[browser sendActionOn:NSLeftMouseDown];
[browser selectRow:0 inColumn:0];
[browser sendAction];

有没有办法区分用户点击和第一次选择的行来选择默认行?

4

3 回答 3

5

在我的应用程序中,我需要跟踪在 NSBrowser 中选择的最后一项。以下设置 NSBrowser:

- (void)awakeFromNib
{
    [browser setDelegate:self];
    [browser setTarget:self];
    [browser setAction:@selector(browserCellSelected:)];
    [browser setSendsActionOnArrowKeys:YES];
}

以下处理单元格,因为它们被选中。这适用于通过鼠标或键盘进行的选择。如果您的应用程序允许多项选择,则您的操作方法将需要处理它。

- (void)browserCellSelected:(id)sender
{
    NSIndexPath *indexPath = [browser selectionIndexPath];
    MyItem *myItem = [browser itemAtIndexPath:indexPath];
    if (myItem)
    {
        NSLog(@"Selected Item: %@", myItem.name);
    }
}

顺便说一句,编程选择不会触发 browserCellSelected: 方法,并且用户单击不会调用委托的 browser:selectRow:inColumn: 方法。

于 2013-02-16T02:13:22.777 回答
0

我没有找到任何 API 来区分用户单击并从代码中选择行和列。为了实现这一点,我声明了一个 BOOL 变量来跟踪用户点击。

在代码之后,我更改了代码中的 BOOL 变量。

self.userClickedOnRow = NO;
        [self.browser selectRow:0 inColumn:0];
    [self.browser sendAction];
        self.userClickedOnRow = YES;

实现了以下委托

 - (void)browser:(NSBrowser *)browser didChangeLastColumn:(NSInteger)oldLastColumn toColumn:(NSInteger)column
    {

        if(!self.userClickedOnRow)
        {
            NSLog(@"Programatic selection");
        }
        if (self.userClickedOnRow)  
        {
            self.userClickedOnRow = NO;
            // User Clicked on the browser,Do the required actions and set the variable again.
            self.userClickedOnRow = YES;

}
}
于 2012-08-17T12:02:37.293 回答
0

您可以继承 NSBrowser 并覆盖 doClick。文档说 doClick 是鼠标单击事件的处理程序,但目前当使用键盘箭头更改行时也会调用它。以下对我有用:

@implementation MyBrowser

...

- (void)doClick:(id)sender {
    [super doClick:sender];

    //
    // Here you can add any handler AFTER the selection has changed
    //
}

...

@end
于 2015-08-20T12:43:37.273 回答