默认为双击。怎么能覆盖呢?
答案 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连接。theTable
。SingleClickAppDelegate
。theArrayController
。theArrayController
保存项目并编译,现在应该有一个包含一些行的表。单击一行时,第二列可编辑。
选择行中的任意位置始终会编辑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:)];
....