测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布时间最后发布 | 2016年4月 |
由 Roman Efimov,Max Horvath,Fedya Skitsko 维护。
依赖 | |
REFormattedNumberField | ~> 1.1.5 |
REValidation | ~> 0.1.4 |
强大的基于数据的 UITableView 内容管理器。
RETableViewManager
允许您轻松管理任何 UITableView
的内容,包括表单和列表。 RETableViewManager
基于可复用单元格技术构建,并提供将任何对象类映射到任何自定义单元格子类的 API。
其基本理念是允许开发者使用自己的 UITableView
和 UITableViewController
实例(甚至子类),提供一个同步数据与单元格外观的层面。它完全实现了 UITableViewDelegate
和 UITableViewDataSource
协议,因此您无需亲自实现。
只需几行代码即可启动您的 UITableView
- (void)viewDidLoad
{
[super viewDidLoad];
// Create the manager and assign a UITableView
//
self.manager = [[RETableViewManager alloc] initWithTableView:self.tableView];
// Add a section
//
RETableViewSection *section = [RETableViewSection sectionWithHeaderTitle:@"Test"];
[self.manager addSection:section];
// Add a string
//
[section addItem:@"Just a simple NSString"];
// Add a basic cell with disclosure indicator
//
[section addItem:[RETableViewItem itemWithTitle:@"String cell" accessoryType:UITableViewCellAccessoryDisclosureIndicator selectionHandler:^(RETableViewItem *item) {
NSLog(@"Test: %@", item);
}]];
// Custom items / cells
//
self.manager[@"CustomItem"] = @"CustomCell";
[section addItem:[CustomItem item]];
}
RETableViewManager 预包装了可扩展且可投入生产的组件
- 文本
- 布尔值
- 数字
- 浮点数
- 日期/时间
- 长文本
- 单选选项选择器
- 多选选项选择器
- 信用卡和到期日期
此外 RETableViewManager
还提供了极其简单的单元格样式 API。
在 Xcode 中构建并运行 RETableViewManagerExample.xcworkspace
,以查看 RETableViewManager
的实际应用。
将 RETableViewManager, REValidation, Resources, REFormattedNumberField 文件夹包含到您的源代码中
关键类 | |
---|---|
RETableViewManager | 管理器类。每个管理器有多个RETableViewSection部分。 |
RETableViewSection | 表示部分RETableViewManager中的部分,每个部分有多个RETableViewItem项。 |
RETableViewItem |
RETableViewItem是大多数RETableViewManager项层级的基础类。 通过RETableViewItem,项继承了一个基本的接口,用于与RETableViewCell和RETableViewManager. |
RETableViewCell | 交互RETableViewCell类定义了在UITableView对象。你应该继承RETableViewCell以获取特定于应用程序需求的单元格特性和行为。默认情况下,RETableViewCell被映射为RETableViewItem. |
样式 | |
RETableViewCellStyle | 为子类提供样式。您可以定义如下属性RETableViewCellbackgroundImageMargincellHeight, contentViewMargin, 等等。辅助控制器 |
RETableViewOptionsController | |
根据用户输入执行选择并在完成后提供结果。应与 | RERadioItemRETableViewManager 包括许多内置项和单元格,可执行常见任务(文本输入、日期输入等)。.
|
内置项和单元格
项类 | ||
---|---|---|
单元格类 | 描述 | RETextItem |
RETableViewTextCell | 为用户文本输入提供便利。您可以通过 | 设置一大堆属性RETableViewTextCell通常在UITextField. |
RELongTextItem | RETableViewLongTextCell | 为多行用户文本输入提供便利。您可以通过RELongTextItem通常在UITextView. |
RENumberItem | RETableViewNumberCell | 使用REFormattedNumberField为用户数字输入提供便利。 |
REBoolItem | RETableViewBoolCell | 通过UISwitch. |
RETableViewManager 包括许多内置项和单元格,可执行常见任务(文本输入、日期输入等)。 |
RETableViewCell | 使用根据用户输入执行选择并在完成后提供结果。应与. |
REMultipleChoiceItem | RETableViewCell | 使用根据用户输入执行选择并在完成后提供结果。应与. |
REFloatItem | RETableViewFloatCell | 为调整0.0到1.0范围内的浮点值提供便利。 |
REDateTimeItem | RETableViewDateTimeCell | 为修改NSDate对象中的日期提供便利。 |
REPickerItem | RETableViewPickerCell | 使用UIPickerView. |
RESegmentedItem | RETableViewSegmentedCell | 为使用UISegmentedControl. |
RECreditCardItem | RETableViewCreditCardCell | 为用户信用卡输入提供便利。允许在单个表格单元格中输入信用卡号、到期日期和安全码。 |
无标题部分
RETableViewSection *section = [RETableViewSection section];
[self.manager addSection:section];
有标题的部分
RETableViewSection *section = [RETableViewSection sectionWithHeaderTitle:@"Header"];
[self.manager addSection:section];
有标题和脚注的部分
RETableViewSection *section = [RETableViewSection sectionWithHeaderTitle:@"Header" footerTitle:@"Footer"];
[self.manager addSection:section];
有自定义头部视图的部分
RETableViewSection *section = [RETableViewSection sectionWithHeaderView:myCustomSectionHeaderView];
[self.manager addSection:section];
有自定义头部和脚注视图的部分
RETableViewSection *section = [RETableViewSection sectionWithHeaderView:myCustomSectionHeaderView footerView:myCustomSectionFooterView];
[self.manager addSection:section];
// Create the manager
//
self.manager = [[RETableViewManager alloc] initWithTableView:self.tableView];
// Add a section
//
RETableViewSection *section = [RETableViewSection sectionWithHeaderTitle:@"Test"];
[self.manager addSection:section];
// Add items to the section
//
self.textItem = [RETextItem itemWithTitle:@"Enter text" value:@""];
[section addItem:self.textItem];
self.numberItem = [RENumberItem itemWithTitle:@"Enter text" value:@"" placeholder:@"(123) 456-7890" format:@"(XXX) XXX-XXXX"];
[section addItem:self.numberItem];
您可以在需要时读取 self.textItem.value
和 self.numberItem.value
。
// Create the manager
//
self.manager = [[RETableViewManager alloc] initWithTableView:self.tableView];
// Add a section
//
RETableViewSection *section = [RETableViewSection sectionWithHeaderTitle:@"Test"];
[self.manager addSection:section];
// Add a bool value cell (using UISwitch)
//
[section addItem:[REBoolItem itemWithTitle:@"Switch test" value:YES switchValueChangeHandler:^(REBoolItem *item) {
NSLog(@"Value: %i", item.value);
}]];
// Create the manager
//
self.manager = [[RETableViewManager alloc] initWithTableView:self.tableView];
// Add a section
//
RETableViewSection *section = [RETableViewSection sectionWithHeaderTitle:@"Test"];
[self.manager addSection:section];
// Add radio cell (options)
//
__typeof (&*self) __weak weakSelf = self;
RERadioItem *radioItem = [RERadioItem itemWithTitle:@"Radio" value:@"Option 4" selectionHandler:^(RERadioItem *item) {
[item deselectRowAnimated:YES]; // same as [weakSelf.tableView deselectRowAtIndexPath:item.indexPath animated:YES];
// Generate sample options
//
NSMutableArray *options = [[NSMutableArray alloc] init];
for (NSInteger i = 1; i < 40; i++)
[options addObject:[NSString stringWithFormat:@"Option %li", (long) i]];
// Present options controller
//
RETableViewOptionsController *optionsController = [[RETableViewOptionsController alloc] initWithItem:item options:options multipleChoice:NO completionHandler:^{
[weakSelf.navigationController popViewControllerAnimated:YES];
[item reloadRowWithAnimation:UITableViewRowAnimationNone]; // same as [weakSelf.tableView reloadRowsAtIndexPaths:@[item.indexPath] withRowAnimation:UITableViewRowAnimationNone];
}];
// Adjust styles
//
optionsController.delegate = weakSelf;
optionsController.style = section.style;
if (weakSelf.tableView.backgroundView == nil) {
optionsController.tableView.backgroundColor = weakSelf.tableView.backgroundColor;
optionsController.tableView.backgroundView = nil;
}
// Push the options controller
//
[weakSelf.navigationController pushViewController:optionsController animated:YES];
}];
[section addItem:radioItem];
// Create the manager
//
self.manager = [[RETableViewManager alloc] initWithTableView:self.tableView];
// Add a section
//
RETableViewSection *section = [RETableViewSection sectionWithHeaderTitle:@"Test"];
[self.manager addSection:section];
// Add a float item
//
[section addItem:[REFloatItem itemWithTitle:@"Float item" value:0.3 sliderValueChangeHandler:^(REFloatItem *item) {
NSLog(@"Value: %f", item.value);
}]];
// Create the manager
//
self.manager = [[RETableViewManager alloc] initWithTableView:self.tableView];
// Add a section
//
RETableViewSection *section = [RETableViewSection sectionWithHeaderTitle:@"Test"];
[self.manager addSection:section];
// Add a date item
//
[section addItem:[REDateTimeItem itemWithTitle:@"Date / Time" value:[NSDate date] placeholder:nil format:@"MM/dd/yyyy hh:mm a" datePickerMode:UIDatePickerModeDateAndTime]];
// Create the manager
//
self.manager = [[RETableViewManager alloc] initWithTableView:self.tableView];
// Add a section
//
RETableViewSection *section = [RETableViewSection sectionWithHeaderTitle:@"Test"];
[self.manager addSection:section];
// Add a picker item
//
[section addItem:[REPickerItem itemWithTitle:@"Picker" value:@[@"Item 12", @"Item 23"] placeholder:nil options:@[@[@"Item 11", @"Item 12", @"Item 13"], @[@"Item 21", @"Item 22", @"Item 23", @"Item 24"]]]];
// Create the manager
//
self.manager = [[RETableViewManager alloc] initWithTableView:self.tableView];
// Add a section
//
RETableViewSection *section = [RETableViewSection sectionWithHeaderTitle:@"Test"];
[self.manager addSection:section];
// Add a segmented item
//
[section addItem:[RESegmentedItem itemWithTitles:@[@"One", @"Two"] value:1 switchValueChangeHandler:^(RESegmentedItem *item) {
NSLog(@"Value: %i", item.value);
}]];
验证通过使用 REValidation 库执行。
示例
self.textItem = [RETextItem itemWithTitle:@"Text" value:@"" placeholder:@"Text item"];
self.textItem.validators = @[@"presence", @"length(3, 10)"];
self.emailItem = [RETextItem itemWithTitle:@"Email" value:@"" placeholder:@"Email item"];
self.emailItem.name = @"Your email";
self.emailItem.validators = @[@"presence", @"email"];
每个项目、每个部分和经理都有属性 errors
。这个属性始终与每个级别的错误保持最新。例如,RETableViewItem
将只能有其自己的验证错误,RETableViewSection
将包含该部分中发生的所有错误(每个项目一个)。RETableViewManager
的 errors
属性会反映所有错误。
RETableViewManager
允许将自定义对象映射到自定义单元格。为了将您的自定义对象(项目)映射到单元格,只需编写
self.manager[@"CustomItem"] = @"CustomCell";
如果您查看 RETableViewManager 源代码,您可以了解到默认映射是如何执行的。
- (void)registerDefaultClasses
{
self[@"__NSCFConstantString"] = @"RETableViewCell";
self[@"__NSCFString"] = @"RETableViewCell";
self[@"NSString"] = @"RETableViewCell";
self[@"RETableViewItem"] = @"RETableViewCell";
self[@"RERadioItem"] = @"RETableViewOptionCell";
self[@"REBoolItem"] = @"RETableViewBoolCell";
self[@"RETextItem"] = @"RETableViewTextCell";
self[@"RELongTextItem"] = @"RETableViewLongTextCell";
self[@"RENumberItem"] = @"RETableViewNumberCell";
self[@"REFloatItem"] = @"RETableViewFloatCell";
self[@"REDateTimeItem"] = @"RETableViewDateTimeCell";
self[@"RECreditCardItem"] = @"RETableViewCreditCardCell";
self[@"REMultipleChoiceItem"] = @"RETableViewOptionCell";
}
您的自定义项目应该从 RETableViewItem
继承。自定义单元格应该从 RETableViewCell
继承。这两个基础类提供了将您的子类绑定在一起所需的所有逻辑。
在您的 RETableViewCell
子类中,您需要将一个 item
对象与您的项目相关联。这可以通过声明它来完成
#import <RETableViewManager/RETableViewManager.h>
#import "CustomItem.h"
@interface CustomCell : RETableViewCell
@property (strong, readwrite, nonatomic) CustomItem *item;
@end
之后,您的自定义对象(项目)就准备好在单元格中使用。
您需要实现 RETableViewCell
的 3 个基本方法
+ (CGFloat)heightWithItem:(RETableViewItem *)item tableViewManager:(RETableViewManager *)tableViewManager;
您的自定义项目将被传递到这个方法中,以确定单元格大小。您需要返回计算出的大小。
- (void)cellDidLoad;
您可能想在这里创建单元格子视图。此方法只会被调用一次,之后单元格将被重用。
- (void)cellWillAppear;
cellWillAppear
是为标签(从您的自定义项目)赋值、调整颜色等的绝佳地方。
快速示例
- (void)cellDidLoad
{
[super cellDidLoad];
self.testLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 44)];
[self.contentView addSubview:self.testLabel];
}
- (void)cellWillAppear
{
[super cellWillAppear];
self.testLabel.text = self.item.someVariable;
}
界面构建器单元格默认支持,无需特殊设置。单元格和项目将被自动注册,就像 RETableViewManager
中的任何其他自定义单元格一样。
self.manager[@"XIBTestItem"] = @"XIBTestCell";
在这里,XIBTestItem
将是您的单元格标识符,并且您应该在您的包中有一个 XIBTestCell.xib
文件。就是这样。
使用 RETableViewManager
可以非常容易地自定义整个 UITableView
(或任何特定部分)的不同偏移量和单元格背景图像。
RETableViewManager
和 RETableViewSection
都有 style
属性(RETableViewCellStyle
类的实例)。
以下是如何进行自定义样式的快速示例
// Set default cell height
//
self.manager.style.cellHeight = 42.0;
// Set cell background image
//
[self.manager.style setBackgroundImage:[[UIImage imageNamed:@"First"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)]
forCellType:RETableViewCellTypeFirst];
[self.manager.style setBackgroundImage:[[UIImage imageNamed:@"Middle"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)]
forCellType:RETableViewCellTypeMiddle];
[self.manager.style setBackgroundImage:[[UIImage imageNamed:@"Last"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)]
forCellType:RETableViewCellTypeLast];
[self.manager.style setBackgroundImage:[[UIImage imageNamed:@"Single"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)]
forCellType:RETableViewCellTypeSingle];
// Set selected cell background image
//
[self.manager.style setSelectedBackgroundImage:[[UIImage imageNamed:@"First_Selected"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)]
forCellType:RETableViewCellTypeFirst];
[self.manager.style setSelectedBackgroundImage:[[UIImage imageNamed:@"Middle_Selected"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)]
forCellType:RETableViewCellTypeMiddle];
[self.manager.style setSelectedBackgroundImage:[[UIImage imageNamed:@"Last_Selected"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)]
forCellType:RETableViewCellTypeLast];
[self.manager.style setSelectedBackgroundImage:[[UIImage imageNamed:@"Single_Selected"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)]
forCellType:RETableViewCellTypeSingle];
self.manager.style.contentViewMargin = 10.0;
self.manager.style.backgroundImageMargin = 10.0;
// Set a custom style for a particular section
//
self.accessoriesSection.style = [self.manager.style copy];
[self.accessoriesSection.style setBackgroundImage:[[UIImage imageNamed:@"First_Alt"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)]
forCellType:RETableViewCellTypeFirst];
[self.accessoriesSection.style setBackgroundImage:[[UIImage imageNamed:@"Middle_Alt"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)]
forCellType:RETableViewCellTypeMiddle];
[self.accessoriesSection.style setBackgroundImage:[[UIImage imageNamed:@"Last_Alt"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)]
forCellType:RETableViewCellTypeLast];
[self.accessoriesSection.style setBackgroundImage:[[UIImage imageNamed:@"Single_Alt"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)]
forCellType:RETableViewCellTypeSingle];
Roman Efimov
RETableViewManager 在 MIT 许可证下提供。
版权所有 © 2013 罗曼·叶菲莫夫
此处特此免费授权任何人复制本软件及相关文档文件(“软件”),在不作限制的情况下处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件的副本,以及允许向软件提供者提供本软件的人处理该软件,基于以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按“现状”提供,不提供任何明示或默示的保证,包括但不限于适销性、适用于特定用途和侵权性。在任何情况下,作者或版权所有者不应对任何索赔、损害或其他责任负责,无论这些责任是否基于合同、侵权或其他法律,是否与软件或软件的使用或其他交易有关。