2
我沒有找到關於這個問題的任何信息,我想知道是否可以通過按下鍵盤上的空格鍵來選擇行,並通過行通過按上/下鍵而不重置選擇。如果有人在Windows下使用它,我想讓nstableview的行爲像總指揮官的文件面板一樣。我甚至不知道從哪裏開始。NSTableView通過按下「space」來選擇行
我沒有找到關於這個問題的任何信息,我想知道是否可以通過按下鍵盤上的空格鍵來選擇行,並通過行通過按上/下鍵而不重置選擇。如果有人在Windows下使用它,我想讓nstableview的行爲像總指揮官的文件面板一樣。我甚至不知道從哪裏開始。NSTableView通過按下「space」來選擇行
您將不得不製作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
謝謝您的回答,我會試試看:) – Uniqus
@Robert我使用此解決方案來標記但是我發現了一個問題:如果我通過單擊表格標題對tableview進行排序,tableview會被排序,但「markedRows」索引集沒有被排序,所以它會存儲錯誤標記項目的索引,如何解決這個問題? – treblam
@treblam嗯,你應該存儲每個項目的獨特的東西,甚至可能是指針,然後用它來代替索引。 –