FODFormKit 是一个用于创建 iOS 动态表单的库。
要运行示例项目;克隆仓库,然后首先从项目目录运行 pod install
有关如何在您的项目中使用此库的详细信息,请参阅下文 创建表单
FODFormKit 目前需要 iOS7。它在 iOS6 上基本正常工作,但有外观问题,目前我没有修复这些问题的需求,所以我不太可能自己修复它们。不过,欢迎提交修复 iOS6 的请求。
您可以使用 FODFormBuilder
对象程序化地创建表单。有关更多示例,请参阅演示项目(FODViewController.m)。
FODFormBuilder *builder = [[FODFormBuilder alloc] init];
[builder startFormWithTitle:@"Main Form"];
[builder section:@"Section 1"];
[builder selectionRowWithKey:@"picker"
andTitle:@"Select a wibble"
andValue:nil
andItems:@[@"wibble1", @"wibble2", @"wibble3"]];
[builder selectionRowWithKey:@"picker2"
andTitle:@"Select a fooby"
andValue:nil
andItems:@[@"fooby1", @"fooby2", @"fooby3"]].displayInline = YES;
[builder section];
[builder rowWithKey:@"date2"
ofClass:[FODDateSelectionRow class]
andTitle:@"When"
andValue:nil];
[builder rowWithKey:@"date1"
ofClass:[FODDateSelectionRow class]
andTitle:@"When Inline"
andValue:nil].displayInline = YES;
FODForm *form = [builder finishForm];
构建对象会自动跟踪嵌套子表单并将它们适当地连接到其父表单。
对构建对象的每次调用都会返回刚刚创建的表单、行或节。如果可能,要让表单或行显示为内联(使用展开/折叠单元格),请添加 .displayInline = YES;
。 (目前只有子表单和支持此选项的 FODSelectionRow
或 FODDateSelectionRow
类型的行。)
每行必须在表单中具有唯一键(在内联子表单的情况下,键也必须在父表单中唯一)。键用于在表单填写完毕后检索表单值。
可以通过编程构建表单,并调用 form.toPlist
来获取表单的 plist 表示形式。然后可以将此格式写入文件,以获取可以编辑的模板。例如,您可以在调试器中执行此类操作
(lldb) po [form.toPlist writeToFile:@"/Users/frank/form2.plist" atomically:YES]
要从 plist 载入表单,请使用
id plist = // load the plist from somewhere, e.g. a file or resource
FODForm *form = [FODForm fromPlist:plist];
为了显示表单并允许用户完成它
FODFormViewController *vc = [[FODFormViewController alloc] initWithForm:form userInfo:nil];
vc.delegate = self;
[self.navigationController pushViewController:vc animated:YES];
为了检索用户填写的内容的值,以及处理取消操作,实现表单代理方法
- (void)formSaved:(FODForm *)model
userInfo:(id)userInfo {
NSString *value1 = (NSString*)[model valueForKeyPath:@"somekey"];
NSString *value2 = (NSString*)[model valueForKeyPath:@"subform.somekey"];
[self.navigationController popViewControllerAnimated:YES];
}
- (void)formCancelled:(FODForm *)model
userInfo:(id)userInfo {
[self.navigationController popViewControllerAnimated:YES];
}
虽然库还不支持大量定制,但可以通过子类化 FODCellFactory
来定制许多方面,以返回不同行类型的不同单元格(例如,现有单元格的子类或 FODFormCell
的新子类)。
您还可以通过添加 FODFormRow
的子类,为它添加一个表示 FODFormCell
的子类,以及扩展 FODFormBuilder
和 FODCellFactory
来支持新行和单元格类型,来添加完全新的行类型。
要添加新的内联可编辑单元格类型,可以子类化 FODInlineEditorCell
,并提供一个用于编辑您的行类型的视图控制器。提供以下方法的覆盖后,超类将管理您的视图控制器的内容。
- (UIViewController*)createEditorController;
- (CGFloat) heightForEditorController:(CGFloat)maxHeight;
请参阅 FODInlinePickerCell
或 FODInlineDatePickerCell
的示例。
(如果您添加了子类或新行类型,请随意发送 pull request)
请认真对待 0.x 版本号(:-)。这是在几天内制作的库的首次切工。尽管大部分功能表现良好,但 API 一定会改变。例如,我希望添加定制显示在文本字段中的键盘的能力,并添加更多行类型和定制选项。
许多方面在横向模式或设备旋转时工作不善。尽管如此,处理了自动旋转,但对于某些编辑类型,横向模式下的高度不足,无法使用。您可能希望因为这一点而阻止横向旋转。
对 iPad 的支持还很少。
Frank O'Dwyer
FODFormKit 可在 MIT 许可下使用。有关更多信息,请参阅 LICENSE 文件。