RETableViewManager 1.7

RETableViewManager 1.7

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布时间最后发布2016年4月

Roman EfimovMax HorvathFedya Skitsko 维护。



 
依赖
REFormattedNumberField~> 1.1.5
REValidation~> 0.1.4
 

  • Roman Efimov

强大的基于数据的 UITableView 内容管理器。

RETableViewManager 允许您轻松管理任何 UITableView 的内容,包括表单和列表。 RETableViewManager 基于可复用单元格技术构建,并提供将任何对象类映射到任何自定义单元格子类的 API。

其基本理念是允许开发者使用自己的 UITableViewUITableViewController 实例(甚至子类),提供一个同步数据与单元格外观的层面。它完全实现了 UITableViewDelegateUITableViewDataSource 协议,因此您无需亲自实现。

RETableViewManager Screenshot

RETableViewManager Screenshot

RETableViewManager Screenshot

快速示例

只需几行代码即可启动您的 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 5 或更高版本
  • Apple LLVM 编译器
  • iOS 7.0 或更高版本
  • ARC

演示

在 Xcode 中构建并运行 RETableViewManagerExample.xcworkspace,以查看 RETableViewManager 的实际应用。

安装

2)包含源代码

将 RETableViewManager, REValidation, Resources, REFormattedNumberField 文件夹包含到您的源代码中

API 快速入门

关键类
RETableViewManager 管理器类。每个管理器有多个RETableViewSection部分。
RETableViewSection 表示部分RETableViewManager中的部分,每个部分有多个RETableViewItem项。
RETableViewItem RETableViewItem是大多数RETableViewManager项层级的基础类。
通过RETableViewItem,项继承了一个基本的接口,用于与RETableViewCellRETableViewManager.
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];

文本(UITextField)和数字(REFormattedNumberField)项示例

// 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.valueself.numberItem.value

布尔项(UISwitch)示例

// 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);
}]];

单选按钮(RETableViewOptionsController)项示例

// 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];

浮点项(UISlider)示例

// 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 将包含该部分中发生的所有错误(每个项目一个)。RETableViewManagererrors 属性会反映所有错误。

自定义单元格

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(或任何特定部分)的不同偏移量和单元格背景图像。

RETableViewManagerRETableViewSection 都有 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 罗曼·叶菲莫夫

此处特此免费授权任何人复制本软件及相关文档文件(“软件”),在不作限制的情况下处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件的副本,以及允许向软件提供者提供本软件的人处理该软件,基于以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“现状”提供,不提供任何明示或默示的保证,包括但不限于适销性、适用于特定用途和侵权性。在任何情况下,作者或版权所有者不应对任何索赔、损害或其他责任负责,无论这些责任是否基于合同、侵权或其他法律,是否与软件或软件的使用或其他交易有关。