Как одним щелчком мыши на NSTextFieldCell в NSTableView, чтобы редактировать его? - PullRequest
3 голосов
/ 08 марта 2011

По умолчанию используется двойной щелчок. Как это можно переопределить?

Ответы [ 5 ]

3 голосов
/ 08 октября 2011

Одним из способов реализации поведения с одним щелчком мыши является переопределение метода 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:.

2 голосов
/ 14 июня 2012

Когда в * 1001 вызывается действие с одним кликом, вызывайте этот метод для конкретной ячейки

- (void)editColumn:(NSInteger)columnIndex
               row:(NSInteger)rowIndex
         withEvent:(NSEvent *)theEven
            select:(BOOL)flag
0 голосов
/ 09 апреля 2016

Вместо того, чтобы создавать подклассы NSTableView, вы можете просто создать категорию. В файле заголовка вашего контроллера представления ( MyViewController.h или в любом файле, к которому IBOutlet подключен к представлению таблицы), объявите новую категорию:

@interface NSTableView( OneClickEdit )
- (void)singleClickEdit: (id)sender;
@end

@interface MyViewController : NSViewController
{
     IBOutlet NSTableView *tableView;
...

Затем в соответствующем файле .m ( MyViewController.m ) добавьте реализацию категории вне самой реализации MyViewController и сделайте этот новый метод методом действия вашего табличного представления в viewDidLoad вашего Контроллер просмотра:

@implementation NSTableView( OneClickEdit )
- (void)singleClickEdit: (id)sender
{
    [self editColumn:[self clickedColumn] row:[self clickedRow] withEvent:nil select:YES];
}
@end
@implementation MyViewContoller

- (void)viewDidLoad
{
    [super viewDidLoad];
    [tableView setAction:@selector(singleClickEdit:)];
....
0 голосов
/ 28 мая 2014

Я думаю, что наиболее элегантный вариант - создать подкласс NSTableView следующим образом:

myNSTableView.h

#import <Cocoa/Cocoa.h>
@interface myNSTableView : NSTableView {

}
- (void)singleClickEdit: (id)sender;
@end

myNSTableView.m

#import "myNSTableView.h"
@implementation myNSTableView

- (void)awakeFromNib
{
   [self setAction:@selector(singleClickEdit:)];
}

- (void)singleClickEdit: (id)sender
{
   NSLog(@"singleClickEdit:");
   [self editColumn:[self clickedColumn] row:[self clickedRow] withEvent:nil select:NO];
}

@end

Вместо NSTableView используйте класс myNSTableview, то есть:

#import <Cocoa/Cocoa.h>
#import "myNSTableView.h"

@interface Preference : NSPanel {
   NSMutableArray             *chargeArray; // Array of ChargeDefault objects
   IBOutlet    myNSTableView  *chargeTableView;
}

Из IB выберите графический объект NSTableView, который был помещен в NSView. Выберите вкладку «Indentity Inspector» и выберите myNSTableView вместо NSTableView.

Вы сделали.

0 голосов
/ 28 марта 2011

Я не думаю, что один щелчок - это хороший идеал.Один щелчок, просто выберите, и двойной щелчок сделать что-то по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...