我想在编辑时更改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上被调用,而其他两个方法从未被调用过。
答案 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
的实例来完成他们的工作。您可以保留两个数字格式器,一个用于编辑案例,另一个用于编辑案例,或者您使用一个格式器并在调用之前不断更改其配置,具体取决于您使用哪种方法实施