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呼び出され、他の 2 つのメソッドは呼び出されませんでした。

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」イベント。関連する 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

つまり、テーブルビューをサブクラス化し、-validateProposedFirstResponder をオーバーライドします

于 2014-10-22T08:55:28.043 に答える