表单 3.15.0

Form 3.15.0

测试验证
语言语言 Obj-CObjective C
许可证 未知
发布最新发布2018年8月

Elvis NuñezChristoffer WinterkvistHyper Interaktiv AS维护。



 
依赖
HYP8601~> 0.7.2
HYPMathParser~> 0.4.1
HYPNorwegianAccountNumber~> 1.2.1
HYPNorwegianSSN~> 1.10.2
NSDictionary-ANDYSafeValue~> 0.3
NSDictionary-HYPNestedAttributes~> 0.4.1
NSJSONSerialization-ANDYJSONFile~> 1.1
NSObject-HYPTesting~> 1.2.1
NSString-HYPContainsString~> 0.1
NSString-HYPFormula~> 1.6.2
NSString-HYPRelationshipParser~> 0.4.1
NSString-HYPWordExtractor~> 1.2
NSString-ZENInflections~> 1.2
UIViewController-HYPKeyboardToolbar~> 0.1
 

Form 3.15.0

Form logo

Version License Platform Gitter

在iOS上构建表单最灵活和最强大的方式。

Form应运而生,因为我们需要一个可以在我们的iOS应用和我们的Web客户端之间共享逻辑的表单。我们发现JSON是最实现这一目标的方式。

Form包含以下特性:

  • 多个分组:例如,您可以为个人细节和发货信息设置不同的分组
  • 字段验证:字段验证:我们支持 requiredmax_lengthmin_lengthmin_valuemax_valueformat(正则表达式)。我们还支持许多字段类型,如 textnumberphone_numberemaildatenamecountsegmentswitch
  • 自定义尺寸:自定义尺寸:总 width 以 100% 处理,而 height 以 85 px 的小块处理
  • 自定义字段:自定义字段:您可以注册自己的自定义字段,这很简单(我们基本示例中包含如何创建 image 字段)
  • 公式或计算值:公式或计算值:我们支持包含生成值的字段,这些值来自其他字段
  • 目标:目标:使用目标来隐藏、显示、更新、启用、禁用或清除字段。这是相当强大的,您甚至可以为目标设置执行条件
  • 下拉列表:下拉列表:创建下拉列表就像将值添加到字段中一样简单,值支持 default 标志、目标(如果要根据选择触发隐藏字段)、字符串和数值或显示额外信息(如果要根据选择提示后果)。

Form在iPhone和iPad上都能使用。

您可以通过在终端中运行以下命令之一尝试我们的其中一个示例:

pod try Form

使用说明

基本表单

创建包含姓氏字段的简单表单的必要步骤如下。

Form

JSON

[
  {
    "id":"group-id",
    "title":"Group title",
    "sections":[
      {
        "id":"section-0",
        "fields":[
          {
            "id":"first_name",
            "title":"First name",
            "type":"name",
            "size":{
              "width":30,
              "height":1
            }
          }
        ]
      }
    ]
  }
]

在您的iOS应用中

AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Don't forget to set your style, or use the default one if you want
    [FORMDefaultStyle applyStyle];

    //...
}

子类

请确保您的 UICollectionViewControllerFORMViewController 的子类。


目标

目标是表单中最强大的功能之一,我们支持通过目标来隐藏、显示、更新、启用、禁用或清除字段。您甚至可以为您的目标设置一个运行条件!

在下面的示例中,我们展示了如何根据下拉选择来隐藏或显示字段。

Targets

JSON

[
  {
    "id":"group-id",
    "title":"Group title",
    "sections":[
      {
        "id":"section-0",
        "fields":[
          {
            "id":"employment_type",
            "title":"Employment type",
            "type":"select",
            "size":{
              "width":30,
              "height":1
            },
            "values":[
              {
                "id":0,
                "title":"Part time",
                "default":true,
                "targets":[
                  {
                    "id":"bonus",
                    "type":"field",
                    "action":"hide"
                  }
                ]
              },
              {
                "id":1,
                "title":"Full time",
                "targets":[
                  {
                    "id":"bonus",
                    "type":"field",
                    "action":"show"
                  }
                ]
              }
            ]
          },
          {
            "id":"bonus",
            "title":"Bonus",
            "type":"number",
            "size":{
              "width":30,
              "height":1
            }
          }
        ]
      }
    ]
  }
]

分组折叠性

分组有两个基于 JSON 的折叠性选项:collapsedcollapsible

collapsed选项接受truefalse,并定义添加到的分组默认状态。默认为false

collapsible选项也接受truefalse,但定义了分组是否可以被折叠。将此选项定义为false,将阻止在点击或使用collapseAllGroupsForCollectionView时折叠分组。默认为true

在您的应用程序代码中,您还可以在数据源上调用collapseAllGroupsForCollectionView以折叠集合视图中的所有分组。

计数字段

为了快速而简单地进行整数调整而不弹出键盘,您可以使用count字段。它的工作方式与number字段相似,但在UITextField的leftView中提供了减号按钮,在rightView中提供了加号按钮。轻轻点击任一键将分别减少或增加一个值。

示例 JSON

{
  "groups":[
    {
      "id":"counter",
      "title":"Counter Example",
      "sections":[
        {
          "id":"counter-example",
          "fields":[
            {
              "id":"guests",
              "title":"Present Guests",
              "info":"Press minus to decrease, plus to increase",
              "type":"count",
              "value":0,
              "size":{
                "width":25,
                "height":1
              },
              "validations":{
                "required":true,
                "min_value":0,
                "max_value":100
              }
            }
          ]
        }
      ]
    }
  ]
}

分段字段

分段字段可以用于文本或选择字段,其中选项已知且有限。由于分段字段不需要多次点击或键盘输入,可以通过单次点击快速轻松地记录数据。segment字段类型允许有多个值,如select字段类型,并支持许多相同的属性。

示例 JSON

{
  "groups":[
    {
      "id":"group1",
      "title":"Segment Example",
      "sections":[
        {
          "id":"section1",
          "fields":[
            {
              "id":"location",
              "title":"Work Location",
              "type":"segment",
              "styles":{
                "font":"AvenirNext-DemiBold",
                "font_size":"16.0",
                "tint_color":"#CBEDBF"
              },
              "values":[
                {
                  "id":"in_house",
                  "title":"In-house",
                  "info":"In-house employee",
                  "default":true,
                },
                {
                  "id":"remote",
                  "title":"Remote",
                }
              ],
              "size":{
                "width":50,
                "height":1
              }
            }
          ]
        }
      ]
    }
  ]
}

切换字段

切换字段可用于需要真实或虚假反应的场景。该switch字段类型允许单个值为0false1true。此字段还有背景和着色颜色样式。

示例 JSON

{
  "groups":[
    {
      "id":"group1",
      "title":"Switch Example",
      "sections":[
        {
          "id":"section1",
          "fields":[
            {
              "id":"budget_approved",
              "title":"Budget Approved",
              "type":"switch",
              "styles":{
                "tint_color":"#CBEDBF"
              },
              "value":false,
              "size":{
                "width":50,
                "height":1
              }
            }
          ]
        }
      ]
    }
  ]
}

无障碍标签

无障碍标签用于iOS上的VoiceOver,为视觉障碍用户提供反馈。根据苹果的说明,无障碍标签属性是“一个简短、本地化的词汇或短语,简洁地描述控件或视图,但不超过识别元素的类型。例如‘添加’或‘播放’。”

字段值自动映射到无障碍值属性,以向用户提供准确的反馈。

除了为有障碍的用户提供辅助反馈外,无障碍标签对UI测试也很有用。如KIFEarlGreyCalabash等库可以使用无障碍标签来访问和控制字段。

示例 JSON

{
  "groups":[
    {
      "id":"group1",
      "title":"Accessibility Example",
      "sections":[
        {
          "id":"section1",
          "fields":[
            {
              "id":"first_name",
              "title":"First Name",
              "info":"Enter your first name",
              "accessibility_label":"First Name Accessibility Label",
              "type":"name",
              "size":{
                "width":25,
                "height":1
              }
            }
          ]
        }
      ]
    }
  ]
}

常见问题解答

如何获取字段的值?

FORMField *targetField = [dataSource fieldWithID:@"display_name" includingHiddenFields:YES];
id value = targetField.value;
// Do something with value

如何获取表单的所有值?

NSDictionary *initialValues = @{@"email" : @"[email protected]",
                                @"companies[0].name" : @"Facebook",
                                @"companies[0].phone_number" : @"1222333"};

FORMDataSource *dataSource = [[FORMDataSource alloc] initWithJSON:JSON
                                                   collectionView:nil
                                                           layout:nil
                                                           values:initialValues
                                                         disabled:NO];
NSDictionary *values = dataSource.values;
// Do something with values

如何创建通用表单?

您需要指定一个针对iOS的特定JSON文件。例如这样的文件,检查iPhone-Storyboard演示以获取更多信息。

我们选择了这种方法,因为它给予开发者更多对UI的控制。您需要添加对设备的检查并展示与设备匹配的JSON文件。

如何动态更新字段的值?

下面这个方法接受两个参数:fieldIDoptionsfieldID参数是一个简单的NSString,包含要更新的字段的ID。options参数是一个包含具有valueIDvalueNamedefaultValue键的NSDictionaries的NSArray。类似的方法可以用来从其他方法或web-service获取数据并在字段中更新。此方法可用于selectsegment字段。

- (void)updateSelectField:(NSString *)fieldID withOptions:(NSArray *)options {
    __weak typeof(self)weakSelf = self;

    [self.dataSource fieldWithID:fieldID includingHiddenFields:YES completion:^(FORMField *field, NSIndexPath *indexPath) {
        NSMutableArray *values = @[].mutableCopy;

        for (NSDictionary *option in options) {
            FORMFieldValue *fieldValue = [FORMFieldValue new];
            fieldValue.valueID = [option valueForKey:@"valueID"];
            fieldValue.title = [option valueForKey:@"valueName"];
            fieldValue.default = [option valueForKey:@"defaultValue"];
            fieldValue.field = field;

            [values addObject:fieldValue];
        }

        field.values = [values copy];

        if (!field.hidden) {
          [weakSelf.dataSource reloadFieldsAtIndexPaths:@[indexPath]];
        }
    }];
}

安装

通过CocoaPods可以获取 Form。要安装,只需将以下行添加到您的Podfile中即可

use_frameworks!

pod 'Form'

贡献

请查阅我们的playbook以获取贡献指南。

在Gitter的Form频道上进行有关代码的详细讨论可能更容易。

致谢

Hyper制作了此内容。我们是一家热情洋溢的数字化沟通公司,热爱优秀的代码和愉快的使用体验。如果您在使用这个库,我们可能想雇佣您(我们也考虑远程员工,唯一的条件是您很棒)。

许可证

Form在MIT许可证下提供。见LICENSE