2

我想在编辑时更改 NSTableView 单元格中显示的值。我的要求如下:最初我输入了一个单元格值 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 out 上被调用,其他两种方法从未被调用过。

4

3 回答 3

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 位。

于 2014-11-05T14:06:37.330 回答
0

好吧,我不知道我是否正确地得到了你需要的东西。看来您正在处理数字格式问题。无论如何,您在问题提到的选择器由 AppKit 调用,但前提是在编辑器视图发生某些事情(例如,击键)。只需单击控件(使其成为 firstResponder)不会触发任何内容。如果我是你,实际上,我宁愿使用委托方法https://developer.apple.com/library/mac/qa/qa1551/_index.html也是http://thegreyblog.blogspot.it/2014/ 06/nscontroltexteditingdelegate-methods.html ) 而不是通过 defaultNotificationCenter。无论如何,这就是我很早就赶上的方式 “BeginEdit”事件,可以更改相关文本字段中我想要的任何值。

@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

于 2014-10-22T08:55:28.043 回答
0

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

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

于 2014-10-22T16:55:26.510 回答