【问题标题】:NSTableView save value without pressing Enter Key on lost focusNSTableView 在失去焦点时无需按 Enter 键即可保存值
【发布时间】:2013-03-10 16:40:18
【问题描述】:

“第一个数字”乘以“第二个数字”得到“小计”。按“总计”按钮给出“小计”的总和

如图所示,包含数字“5”的单元格处于可编辑状态。当我单击“总计”按钮时,会触发一种方法,该方法将“小计”列中的数字相加。我希望在执行加法之前自动保存处于可编辑状态的数字,以便正确答案为 156.00 而不是 136.00,如“总计”按钮下方的标签中所示

【问题讨论】:

    标签: objective-c macos cocoa nstableview


    【解决方案1】:

    回忆 MVC 设计模式

    您的NSTableView 只是一个视图,您将模型(数组)显示在它上面。

    因此,您更改了视图部分中的值,但您的模型没有更改。您需要更改模型,即您在 tableview 中显示的数组或任何集合。

    在按钮操作中只需调用[tableView reloadData],然后- (void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row : tablview 的委托方法将被调用,您的模型将得到更新。导致您输入的数据。

    查看示例:

    - (id)init
    {
        self = [super init];
        if (self) {
            self.array=[NSMutableArray new];
    
            for (NSInteger i=0; i<30; i++) {
                [self.dict setObject:[NSString stringWithFormat:@"Obj %ld",i] forKey:[NSString stringWithFormat:@"%ld",i]];
                self.array[i]=@(i);
            }
        }
        return self;
    }
    
    - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView{
        return self.array.count;
    }
    
    - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
        return self.array[row];
    }
    
    
    - (void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
        self.array[row]=object;
    
    }
    

    你的答案在这里:

    - (IBAction)button:(id)sender {
    
        [self.myTable reloadData];
    
        NSInteger row=[self.myTable selectedRow];
        NSLog(@"%@",[self.array objectAtIndex:row]);
    
    }
    

    【讨论】:

    • 我更重要的是,如果您将总计保存到模型中,这不好,您应该在从模型中读取后计算它。由于将总数保存到模型中并不是一个好方法,而且会浪费内存。
    【解决方案2】:

    您需要跟踪正在编辑的单元格(或者实际上是文本字段),当触摸“总计”按钮时,在该文本字段上调用“resignFirstResponder”,这也应该更新您的小计和数组或数组控制器,最终为您提供正确的总数。

    跟踪正在编辑哪个单元格的一种方法是将所有可编辑单元格的文本字段设置为全部使用您的视图(或窗口)控制器作为代理,然后您将知道哪个单元格正在被编辑在委托方法control:textShouldBeginEditing: 上(正在编辑的文本字段通过“control”参数传入...您可以在 ivar 或属性中跟踪它)。这就是您可以调用“resignFirstResponder”的单元格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多