Одним из способов реализации поведения с одним щелчком мыши является переопределение метода setAction
.Вот пример этого для NSTableView, который позволяет пользователю редактировать один столбец из любой строки таблицы, щелкнув по нему один раз:
SingleClickAppDelegate.h
#import <Cocoa/Cocoa.h>
@interface SingleClickAppDelegate : NSObject <NSApplicationDelegate>
{
IBOutlet NSTableView *theTable;
IBOutlet NSArrayController *theArrayController;
NSInteger colNumber;
}
- (void)addRow;
- (void)doClickEdit: (id)sender;
@end
SingleClickAppDelegate.m
#import "SingleClickAppDelegate.h"
@implementation SingleClickAppDelegate
- (void)awakeFromNib
{
[self addRow];
[self addRow];
[self addRow];
[theTable setTarget:self];
/// Single click action
[theTable setAction:@selector(doClickEdit:)];
}
/// Add some temporary data to edit
- (void)addRow
{
NSMutableDictionary *values = [[NSMutableDictionary alloc] init];
[values setObject:[NSNumber numberWithLong:colNumber++] forKey:@"col1"];
[values setObject:@"Text" forKey:@"col2"];
[theArrayController addObject:values];
[values release];
[theTable reloadData];
}
/// Action
- (void)doClickEdit: (id)sender
{
NSLog(@"doClickEdit:");
NSInteger row = [theTable clickedRow];
[theTable editColumn:1 row:row withEvent:nil select:YES];
}
@end
Теперь создайте привязки в конструкторе интерфейса:
- Создайте объект класса
SingleClickAppDelegate
, который будет связывать приведенный выше код с графическим интерфейсом. - Создайте NSTableView и привяжите его к
theTable
. - Привязайте NSTableView dataSource и делегат к
SingleClickAppDelegate
. - Создайте NSArrayControllerи связать его с
theArrayController
. - Для каждого столбца в таблице:
- Привязать его значение к
theArrayController
- Установить Ключ контроллера to selectedObjects.
- Установите Путь к ключу модели для каждой клавиши сверху (в данном примере это "col1" и "col2")
Сохраните проект и скомпилируйте, теперь должна быть таблица с несколькими строками.При щелчке по строке второй столбец становится редактируемым.
Выбор в любом месте строки всегда редактирует столбец, установленный в doClickEdit:
.