2011-03-08 84 views

回答

0

我不認爲單擊是一個很好的理想。單擊只需選擇,然後雙擊做一些默認的事情。

+8

在某些情況下,它是一個好主意。 – Lucidus 2011-05-25 01:27:13

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 

現在做出的綁定在Interface Builder:

  • 創建CLA的對象ss SingleClickAppDelegate它將把上面的代碼與GUI連接起來。
  • 創建一個NSTableView並將其綁定到theTable
  • 將NSTableView dataSource代表綁定到SingleClickAppDelegate
  • 創建一個NSArrayController並將其綁定到theArrayController
  • 對於表中的每一列:
    • 綁定其值設置爲theArrayController
    • 設置控制器關鍵到arrangedObjects。
    • 從上面設置型號關鍵路徑每個鍵(在這個例子中它是所有「col1」和「COL2」)

保存項目並編譯,現在應該有一個表一些行。當單擊一行時,第二列就可以編輯了。

選擇行中的任何位置將始終編輯在​​中設置的列。

2

當單一的點擊動作被稱爲TableView調用此方法爲特定的細胞

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

我覺得最優雅的選擇是繼承NSTableView的如下:

myNSTableView.h

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

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

myNSTableView。米

#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中,選擇其中已放入的NSView的NSTableView的圖形對象。選擇「Indentity Inspector」選項卡,然後選擇myNSTableView而不是NSTableView。

你完成了。

0

而不是繼承NSTableView的子類,您可以創建一個圖章。 在視圖控制器(MyViewController.h或具有連接到所述表視圖一個IBOutlet任何文件)的頭文件中,聲明新cathegory:

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

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

然後在相應的m文件(MyViewController.m)添加cathegory實施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:)]; 
.... 
相關問題