如何格式化 XLForm 行值

Posted

技术标签:

【中文标题】如何格式化 XLForm 行值【英文标题】:How to format an XLForm row value 【发布时间】:2015-10-14 12:54:55 【问题描述】:

我在我的项目中使用XLForm 并希望以特定格式显示其中一行的值。

该行是“年营业额”,我想将用户输入的值显示为货币 - 例如,如果用户在表单字段中输入 1000000,则应更新该字段显示:$ 1,000,000.00

我该怎么做?

这是在 initializeForm() 中初始化表单字段的方式:

-(void)initializeForm


    // Other fields in the form...

    // Annual turnover Section
    self.section = [XLFormSectionDescriptor formSectionWithTitle:formLabel8AnnualTurnover];
    //section.footerTitle = @"Describe new products";
    [self.formDescriptor addFormSection:self.section];

    // Annual turnover
    self.row = [XLFormRowDescriptor formRowDescriptorWithTag:formField8AnnualTurnover rowType:XLFormRowDescriptorTypeText title:nil];
    self.row.required = NO;
    rowDescriptor8AnnualTurnover = self.row;
    [self.section addFormRow:self.row];

    // Other fields in the form...

    self.form = self.formDescriptor;


根据the documentation,我应该捕捉到用户已经与字段交互,然后更改字段的值并更新行。

这就是我发现用户在字段中输入内容的方式:

-(void)formRowDescriptorValueHasChanged:(XLFormRowDescriptor *)rowDescriptor oldValue:(id)oldValue newValue:(id)newValue

        [super formRowDescriptorValueHasChanged:rowDescriptor oldValue:oldValue newValue:newValue];

        // Get the current form values
        formValues = [self.form formValues];

        int i = 0;

        if ([rowDescriptor.tag hasPrefix:formField8AnnualTurnover])
                NSString *annualTurnoverValue = [(XLFormOptionsObject*)formValues[formField8AnnualTurnover] displayText];
                rowDescriptor8AnnualTurnover.value = [NSString stringWithFormat:@"R %@", annualTurnoverValue]; //This breaks.
                [self reloadFormRow:rowDescriptor8AnnualTurnover];
                

【问题讨论】:

formRowDescriptorValueHasChanged 工作吗? 它告诉你哪个 rowDescriptor 改变了,所以基于它,你可以做一些事情。我已经使用它来根据选择的一行隐藏/显示不同的行。 是的。我知道。我的意思是你的代码工作正常? rowDescriptor8AnnualTurnover.value = [NSString stringWithFormat:@"R %@", annualTurnoverValue]; //This breaks. 【参考方案1】:

通过重置formRowDescriptorValueHasChanged 中的rowDescriptor 的值正在创建一个无限循环。

我通过更改formRowDescriptorValueHasChanged 解决了这个问题,首先检查rowDescriptor 的值是否已经以货币符号开头,只有在缺少时才添加:

-(void)formRowDescriptorValueHasChanged:(XLFormRowDescriptor *)rowDescriptor oldValue:(id)oldValue newValue:(id)newValue


   [super formRowDescriptorValueHasChanged:rowDescriptor oldValue:oldValue newValue:newValue];

   // Get the current form values
   formValues = [self.form formValues];
   if ([rowDescriptor.tag hasPrefix:formField8AnnualTurnover])
        NSString *annualTurnoverValue = [(XLFormOptionsObject*)formValues[formField8AnnualTurnover] displayText];
        if([annualTurnoverValue hasPrefix:@"R "])
            // Do nothing - the value will simply be increased.
        else
            rowDescriptor8AnnualTurnover.value = [NSString stringWithFormat:@"R %@", annualTurnoverValue];
            [self reloadFormRow:rowDescriptor8AnnualTurnover];
                    
        

【讨论】:

如何在 reloadFormRow 之后将此行重新分配为第一响应者:? 我不再做 ios 开发了 - 希望其他人可以帮助你。

以上是关于如何格式化 XLForm 行值的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 XLForm 禁用的行文本颜色 [XLFormRowDescriptorTypeText]

如何将 NSPredicate 应用于自定义 XLForm 行?

XLForm如何添加两个BooleanCheck导入互斥关系

Swift 中的 XLForm 验证

如何将所有日期格式转换为日期列的时间戳?

Python Pandas:更改格式,其中索引和列名以及相应的值是新的行值