2012-10-03 46 views
2

我沒有找到關於這個問題的任何信息,我想知道是否可以通過按下鍵盤上的空格鍵來選擇行,並通過行通過按上/下鍵而不重置選擇。如果有人在Windows下使用它,我想讓nstableview的行爲像總指揮官的文件面板一樣。我甚至不知道從哪裏開始。NSTableView通過按下「space」來選擇行

回答

1

您將不得不製作NSTableView類的子類。這是你如何做到的基本例子。它用空格鍵和鼠標右鍵處理選擇,但它不處理鼠標右鍵拖動選擇。

想法是在單選模式下使用NSTableView並實現替代選擇。我們添加物業標記行然後用它代替原來的selected行屬性。

FOTableView.h

#import <Cocoa/Cocoa.h> 

@interface FOTableView : NSTableView 

@property (strong,nonatomic) NSMutableIndexSet *markedRows; 

@end 

FOTableView.m

#import "FOTableView.h" 

@implementation FOTableView 

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
    } 

    return self; 
} 

-(NSMutableIndexSet *) markedRows 
{ 
    if (!_markedRows) { 
     _markedRows = [NSMutableIndexSet new]; 
    } 
    return _markedRows; 
} 

- (void)drawRow:(NSInteger)row clipRect:(NSRect)clipRect 
{ 
    if ([self.markedRows containsIndex:row]) { 
     NSRect clipRect = [self rectOfRow:row]; 
     NSColor *color = [NSColor colorWithCalibratedRed:0.932 green:0.046 blue:0.960 alpha:1.000]; 
     [color setFill]; 
     NSRectFill(clipRect); 
    } 

    [super drawRow:row clipRect:clipRect]; 
} 

- (void)keyDown:(NSEvent *)theEvent 
{ 
    NSString *keyString; 
    unichar keyChar; 

    keyString = [theEvent charactersIgnoringModifiers]; 
    keyChar = [keyString characterAtIndex:0]; 
    NSInteger row = [self selectedRow]; 
    switch(keyChar){    
     case 32: 
     { 
      if (row != -1) 
      { 
       if ([self.markedRows containsIndex:row]) { 
        [self.markedRows removeIndex:row]; 
       } 
       else { 
        [self.markedRows addIndex:row]; 
       } 
      } 
      [self selectRowIndexes:[NSIndexSet indexSetWithIndex:++row] byExtendingSelection:NO]; 
      [self setNeedsDisplay:YES]; 
      break; 
     } 

     default: 
      [super keyDown:theEvent]; 
    } 

    NSLog(@"key pressed: (%hu)%@", keyChar,keyString); 
} 

- (void)rightMouseDown:(NSEvent *)theEvent 
{ 
    NSInteger row = [self rowAtPoint:[self convertPoint:[theEvent locationInWindow] fromView:nil]]; 
    if ([self.markedRows containsIndex:row]) { 
     [self.markedRows removeIndex:row]; 
    } 
    else { 
     [self.markedRows addIndex:row]; 
    } 

    [self setNeedsDisplay:YES]; 
} 

@end 
+0

謝謝您的回答,我會試試看:) – Uniqus

+0

@Robert我使用此解決方案來標記但是我發現了一個問題:如果我通過單擊表格標題對tableview進行排序,tableview會被排序,但「markedRows」索引集沒有被排序,所以它會存儲錯誤標記項目的索引,如何解決這個問題? – treblam

+0

@treblam嗯,你應該存儲每個項目的獨特的東西,甚至可能是指針,然後用它來代替索引。 –

相關問題