在iOS上构建表单最灵活和最强大的方式。
Form应运而生,因为我们需要一个可以在我们的iOS应用和我们的Web客户端之间共享逻辑的表单。我们发现JSON是最实现这一目标的方式。
Form包含以下特性:
- 多个分组:例如,您可以为个人细节和发货信息设置不同的分组
- 字段验证:字段验证:我们支持
required
,max_length
,min_length
,min_value
,max_value
和format
(正则表达式)。我们还支持许多字段类型,如text
,number
,phone_number
,email
,date
,name
,count
,segment
,switch
等 - 自定义尺寸:自定义尺寸:总
width
以 100% 处理,而height
以 85 px 的小块处理 - 自定义字段:自定义字段:您可以注册自己的自定义字段,这很简单(我们基本示例中包含如何创建
image
字段) - 公式或计算值:公式或计算值:我们支持包含生成值的字段,这些值来自其他字段
- 目标:目标:使用目标来隐藏、显示、更新、启用、禁用或清除字段。这是相当强大的,您甚至可以为目标设置执行条件
- 下拉列表:下拉列表:创建下拉列表就像将值添加到字段中一样简单,值支持
default
标志、目标(如果要根据选择触发隐藏字段)、字符串和数值或显示额外信息(如果要根据选择提示后果)。
Form在iPhone和iPad上都能使用。
您可以通过在终端中运行以下命令之一尝试我们的其中一个示例:
pod try 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];
//...
}
子类
请确保您的 UICollectionViewController
是 FORMViewController
的子类。
目标
目标是表单中最强大的功能之一,我们支持通过目标来隐藏、显示、更新、启用、禁用或清除字段。您甚至可以为您的目标设置一个运行条件!
在下面的示例中,我们展示了如何根据下拉选择来隐藏或显示字段。
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 的折叠性选项:collapsed
和collapsible
collapsed
选项接受true
或false
,并定义添加到的分组默认状态。默认为false
。
collapsible
选项也接受true
或false
,但定义了分组是否可以被折叠。将此选项定义为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
字段类型允许单个值为0
、false
、1
或true
。此字段还有背景和着色颜色样式。
示例 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测试也很有用。如KIF、EarlGrey和Calabash等库可以使用无障碍标签来访问和控制字段。
示例 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文件。
如何动态更新字段的值?
下面这个方法接受两个参数:fieldID
和options
。fieldID
参数是一个简单的NSString,包含要更新的字段的ID。options
参数是一个包含具有valueID
、valueName
和defaultValue
键的NSDictionaries的NSArray。类似的方法可以用来从其他方法或web-service获取数据并在字段中更新。此方法可用于select
和segment
字段。
- (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。