2012-08-06 34 views
2

在我的Browser實現中選擇默認行我已經使用了下面的代碼。如何找到用戶點擊NSBrowser中的任何一行?

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

有什麼辦法可以區分用戶點擊和第一次選擇的行以選擇默認行嗎?

回答

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; 

} 
} 
4

在我的應用程序,我需要跟蹤的NSBrowser選擇的最後一個項目。以下設置NS瀏覽器:

- (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); 
    } 
} 

BTW,方案的選擇將不發射browserCellSelected:方法和用戶點擊就無法調用該委託的瀏覽器:selectRow:inColumn:方法。

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 
相關問題