编辑时更改NSTableView单元格值

时间:2014-10-20 14:30:29

标签: objective-c cocoa nstableview nstableviewcell

我想在编辑时更改NSTableView Cell中显示的值。我的要求如下: 最初我输入的单元格值为234.5678978,编辑后的值被舍入为0小数精度(即235)。我的要求是,当我可以单击该单元格时,它应该向我显示某个十进制精度的值,例如高达5精度,在本例中为234.56790)。我该如何实现此功能。 我试图捕获双击编辑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在tab上被调用,而其他两个方法从未被调用过。

3 个答案:

答案 0 :(得分: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]; } } } } 代表中为已修改的单元格添加了自定义格式化程序
{{1}}

因此,当编辑单元格时,它会将精度设置为5位小数,在所有其他情况下,它会将单元格格式化程序设置为2位小数。

答案 1 :(得分: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

答案 2 :(得分:0)

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

由于NSNumberFormatter为您做了很多细节工作,我建议您构建一个类,以便使用NSNumberFormatter或两个来实现它。也就是说,您的类的方法将调用NSNumberFormatter的实例来完成他们的工作。您可以保留两个数字格式器,一个用于编辑案例,另一个用于编辑案例,或者您使用一个格式器并在调用之前不断更改其配置,具体取决于您使用哪种方法实施