2014-10-20 147 views
0

我想在编辑时更改NSTableView单元格中显示的值。我的要求如下: 最初我输入的单元格值为234.5678978,编辑后值被四舍五入为0的十进制精度(即235)。我的要求是,当我可以点击那个单元格时,它应该显示我的值到一定的小数精度,比如5精度,在本例中为234.56790)。我怎样才能实现这个功能。 我试图捕捉双击编辑NSTableView的的细胞的作用:编辑时更改NSTableView单元格值

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(editingDidEnd:) 
               name:NSControlTextDidEndEditingNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(editingDidBegin:) 
               name:NSControlTextDidBeginEditingNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(editingDidChange:) 
               name:NSControlTextDidChangeNotification object:nil]; 

- (void)editingDidEnd:(NSNotification *)notification 
{ 
    NSLog(@"text editing fisnished"); 
} 

- (void)editingDidBegin:(NSNotification *)notification 
{ 
    NSLog(@"text is being edited"); 
} 
- (void)editingDidChange:(NSNotification *)notification 
{ 
    NSLog(@"text was being changed"); 
} 

但只有editingDidEnd叫上标签了,而且从来没有叫其他两种方法。

回答

2

我增加了对编辑的单元格的自定义格式在willDisplayCell委托NSTableView

- (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    if(tableView == self.tableView) 
    { 
     if(![[tableColumn identifier]isEqualToString:@"name"]){ 
      [cell setFormatter:nil]; 

      if (row == [tableView editedRow] && [[tableView tableColumns] indexOfObject:tableColumn] == [tableView editedColumn]) // the cell is getting edited 
      { 
       [(NSTextFieldCell*)cell setTextColor:[NSColor redColor]]; 
       NSNumberFormatter *nf = [[NSNumberFormatter alloc] init]; 
       [nf setMaximumFractionDigits:5]; // Setting the precision value upto 5 decimal places 
       [nf setMinimumFractionDigits:0]; 
       [cell setFormatter:nf]; 
      } 
      else{ 
       [(NSTextFieldCell*)cell setTextColor:[NSColor blackColor]]; 
       //[cell setFormatter:nil]; 
       NSNumberFormatter *nf = [[NSNumberFormatter alloc] init]; 
       [nf setMaximumFractionDigits:2]; // setting decimal value upto 2 decimal places 
       [nf setMinimumFractionDigits:0]; 
       [cell setFormatter:nf]; 
      } 
     } 

    } 
} 

所以,当一个细胞被编辑,将精度设置为5位数字,在所有其他情况下,将设置单元格格式化器到2位小数。

0

嗯,我不知道我是否正确地得到你需要的东西。看来你正在处理数字格式问题。 无论如何,您在问题中提到的选择器是由AppKit调用的,但如果在编辑器视图中发生了某些事情(例如按键),则仅限于。 只需单击控件(使其成为firstResponder),将不会触发任何操作。 如果我是你,实际上,我宁愿使用代理方法(https://developer.apple.com/library/mac/qa/qa1551/_index.html,但http://thegreyblog.blogspot.it/2014/06/nscontroltexteditingdelegate-methods.html ),而不是通过defaultNotificationCenter传递。 在任何情况下,这是我如何赶上非常早“BeginEdit”事件,有可能改变任何值,我想在相关的TextField。

@interface YourTableView : NSTableView 

@end 


@implementation YourTableView 

- (BOOL)validateProposedFirstResponder:(NSResponder *)responder forEvent:(NSEvent *)event { 
    BOOL acceptFirstResponder = [super validateProposedFirstResponder:responder forEvent:event]; 
    if (acceptsFirstResponder && (
     event == nil || // catches tabs 
     event.type == NSLeftMouseDown)) { // catches mouse clicks) { 
     [responder setStringValue:@"<YourFormattedNumber>"]; 
    } 
    return acceptFirstResponder; 
} 

- (BOOL)resignFirstResponder { 

// Additional formatting code 
    return YES; 
} 

@end 

即继承你的tableview,然后覆盖-validateProposedFirstResponder

+0

'validateProposedFirstResponder'没有在我的NSTableView子类中调用。 – triandicAnt 2014-10-22 11:45:24

+0

确保在表格视图的IB属性中取消选中“拒绝第一响应者”。另请注意,“validateProposedFirstResponder”在SDK10.7以下目标上不可用 – 2014-10-22 12:38:51

+0

我在“if”条件下编辑了代码部分。 通过这种方式可以确保您仅捕获所选单元格中的鼠标点击,从而避免干扰正常的tableview超类的行为。 希望它有帮助。 – 2014-10-23 10:51:17

0

我建议你创建的NSFormatter自定义子类。有两种方法,-stringForObjectValue:-editingStringForObjectValue:。这个区别正是你想要的。第一个提供不编辑时的值。第二个提供编辑时的值,用于需要格式不同的情况。

由于NSNumberFormatter为你做了很多细致的工作,我建议你建立你的班级,使用NSNumberFormatter或两个实施。也就是说,你的班级的方法会调用NSNumberFormatter的实例来完成他们的工作。您可以保留两个数字格式化程序,一个用于非编辑案例,另一个用于编辑案例,或者您可以使用一个,并在调用它之前不断更改其配置,具体取决于您正在实施的方法。

相关问题