如何在NSTableView中单击NSTextFieldCell进行编辑?

时间:2011-03-08 17:43:52

标签: cocoa nstableview

默认为双击。怎么能覆盖呢?

5 个答案:

答案 0 :(得分:3)

实现单击行为的一种方法是覆盖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的对象,它将上述代码与GUI连接。
  • 创建NSTableView并将其绑定到theTable
  • 将NSTableView dataSource 委托绑定到SingleClickAppDelegate
  • 创建一个NSArrayController并将其绑定到theArrayController
  • 对于表格中的每一列:
    • 将其价值绑定到theArrayController
    • 控制器密钥设置为arrangeObjects。
    • 从上方为每个键设置模型键路径(在此示例中为“col1”和“col2”)

保存项目并编译,现在应该有一个包含一些行的表。单击一行时,第二列可编辑。

选择行中的任意位置始终会编辑doClickEdit:中设置的列。

答案 1 :(得分:2)

TableView中调用单击操作时,为特定单元格调用此方法

- (void)editColumn:(NSInteger)columnIndex
               row:(NSInteger)rowIndex
         withEvent:(NSEvent *)theEven
            select:(BOOL)flag

答案 2 :(得分:0)

我不认为单击是一个很好的理想。单击只需选择,然后双击执行一些默认操作。

答案 3 :(得分:0)

我认为最优雅的选择是将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

使用myNSTableview类,而不是NSTableView,即:

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

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

从IB中,选择已放入NSView的NSTableView图形对象。选择&#34; Indentity Inspector&#34;选项卡,然后选择myNSTableView而不是NSTableView。

你已经完成了。

答案 4 :(得分:0)

您可以创建一个导管,而不是继承NSTableView。 在视图控制器的头文件中( MyViewController.h 或任何连接到表视图的IBOutlet的文件),声明新的导管:

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

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

然后在相应的.m文件( MyViewController.m )中添加myViewController实现本身之外的导体实现,并使该新方法成为viewDidLoad中表视图的action方法你的视图控制器:

@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:)];
....