Add inline picker item / cell

This commit is contained in:
Roman Efimov
2013-10-05 11:53:27 -05:00
parent 57d2925fe3
commit 4304a67140
10 changed files with 197 additions and 1 deletions

View File

@@ -0,0 +1,16 @@
//
// RETableViewInlinePickerCell.h
// RETableViewManagerExample
//
// Created by Roman Efimov on 10/5/13.
// Copyright (c) 2013 Roman Efimov. All rights reserved.
//
#import "RETableViewCell.h"
#import "REInlinePickerItem.h"
@interface RETableViewInlinePickerCell : RETableViewCell <UIPickerViewDataSource, UIPickerViewDelegate>
@property (strong, readwrite, nonatomic) REInlinePickerItem *item;
@end

View File

@@ -0,0 +1,83 @@
//
// RETableViewInlinePickerCell.m
// RETableViewManagerExample
//
// Created by Roman Efimov on 10/5/13.
// Copyright (c) 2013 Roman Efimov. All rights reserved.
//
#import "RETableViewInlinePickerCell.h"
#import "REPickerItem.h"
@interface RETableViewInlinePickerCell ()
@property (strong, readwrite, nonatomic) UIPickerView *pickerView;
@end
@implementation RETableViewInlinePickerCell
+ (CGFloat)heightWithItem:(RETableViewItem *)item tableViewManager:(RETableViewManager *)tableViewManager
{
return 216.0f;
}
- (void)cellDidLoad
{
[super cellDidLoad];
self.pickerView = [[UIPickerView alloc] init];
self.pickerView.delegate = self;
self.pickerView.dataSource = self;
[self.contentView addSubview:self.pickerView];
}
- (void)cellWillAppear
{
[super cellWillAppear];
self.selectionStyle = UITableViewCellSelectionStyleNone;
[self.item.pickerItem.options enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([self.item.pickerItem.options objectAtIndex:idx] && [self.item.pickerItem.value objectAtIndex:idx] > 0)
[self.pickerView selectRow:[[self.item.pickerItem.options objectAtIndex:idx] indexOfObject:[self.item.pickerItem.value objectAtIndex:idx]] inComponent:idx animated:NO];
}];
}
#pragma mark -
#pragma mark UIPickerViewDataSource
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return self.item.pickerItem.options.count;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return [[self.item.pickerItem.options objectAtIndex:component] count];
}
#pragma mark -
#pragma mark UIPickerViewDelegate
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
NSArray *items = [self.item.pickerItem.options objectAtIndex:component];
return [items objectAtIndex:row];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
[self shouldUpdateItemValue];
}
- (void)shouldUpdateItemValue
{
NSMutableArray *value = [NSMutableArray array];
[self.item.pickerItem.options enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSArray *options = [self.item.pickerItem.options objectAtIndex:idx];
NSString *valueText = [options objectAtIndex:[self.pickerView selectedRowInComponent:idx]];
[value addObject:valueText];
}];
self.item.pickerItem.value = [value copy];
[self.item.pickerItem reloadRowWithAnimation:UITableViewRowAnimationNone];
}
@end

View File

@@ -90,6 +90,10 @@
if (!self.item.title) {
self.valueLabel.textAlignment = NSTextAlignmentLeft;
}
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 70000
self.valueLabel.textColor = self.item.inlinePickerItem ? self.tintColor : self.detailTextLabel.textColor;
#endif
}
- (void)layoutSubviews
@@ -108,13 +112,35 @@
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
if (selected) {
if (selected && !self.item.inlineDatePicker) {
[self.textField becomeFirstResponder];
[self.item.options enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([self.item.options objectAtIndex:idx] && [self.item.value objectAtIndex:idx] > 0)
[self.pickerView selectRow:[[self.item.options objectAtIndex:idx] indexOfObject:[self.item.value objectAtIndex:idx]] inComponent:idx animated:NO];
}];
}
if (selected && self.item.inlineDatePicker && !self.item.inlinePickerItem) {
[self setSelected:NO animated:NO];
[self.item deselectRowAnimated:NO];
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 70000
self.valueLabel.textColor = self.tintColor;
#endif
self.item.inlinePickerItem = [REInlinePickerItem itemWithPickerItem:self.item];
[self.section insertItem:self.item.inlinePickerItem atIndex:self.item.indexPath.row + 1];
[self.tableViewManager.tableView insertRowsAtIndexPaths:@[self.item.inlinePickerItem.indexPath] withRowAnimation:UITableViewRowAnimationBottom];
} else {
if (selected && self.item.inlineDatePicker && self.item.inlinePickerItem) {
[self setSelected:NO animated:NO];
[self.item deselectRowAnimated:NO];
self.valueLabel.textColor = self.detailTextLabel.textColor;
NSIndexPath *indexPath = [self.item.inlinePickerItem.indexPath copy];
[self.section removeItemAtIndex:self.item.inlinePickerItem.indexPath.row];
self.item.inlinePickerItem = nil;
[self.tableViewManager.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
}
}
}
- (UIResponder *)responder

View File

@@ -0,0 +1,20 @@
//
// REInlinePickerItem.h
// RETableViewManagerExample
//
// Created by Roman Efimov on 10/5/13.
// Copyright (c) 2013 Roman Efimov. All rights reserved.
//
#import "RETableViewItem.h"
@class REPickerItem;
@interface REInlinePickerItem : RETableViewItem
@property (weak, readwrite, nonatomic) REPickerItem *pickerItem;
+ (instancetype)itemWithPickerItem:(REPickerItem *)pickerItem;
- (id)initWithPickerItem:(REPickerItem *)pickerItem;
@end

View File

@@ -0,0 +1,27 @@
//
// REInlinePickerItem.m
// RETableViewManagerExample
//
// Created by Roman Efimov on 10/5/13.
// Copyright (c) 2013 Roman Efimov. All rights reserved.
//
#import "REInlinePickerItem.h"
@implementation REInlinePickerItem
+ (instancetype)itemWithPickerItem:(REPickerItem *)pickerItem
{
return [[self alloc] initWithPickerItem:pickerItem];
}
- (id)initWithPickerItem:(REPickerItem *)pickerItem
{
self = [super init];
if (self) {
_pickerItem = pickerItem;
}
return self;
}
@end

View File

@@ -24,12 +24,15 @@
//
#import "RETableViewItem.h"
#import "REInlinePickerItem.h"
@interface REPickerItem : RETableViewItem
@property (strong, readwrite, nonatomic) NSArray *options;
@property (strong, readwrite, nonatomic) NSArray *value;
@property (copy, readwrite, nonatomic) NSString *placeholder;
@property (assign, readwrite, nonatomic) BOOL inlineDatePicker;
@property (strong, readwrite, nonatomic) REInlinePickerItem *inlinePickerItem;
+ (instancetype)itemWithTitle:(NSString *)title value:(NSArray *)value placeholder:(NSString *)placeholder options:(NSArray *)options;
- (id)initWithTitle:(NSString *)title value:(NSArray *)value placeholder:(NSString *)placeholder options:(NSArray *)options;

View File

@@ -50,6 +50,7 @@
#import "REPickerItem.h"
#import "RESegmentedItem.h"
#import "REInlineDatePickerItem.h"
#import "REInlinePickerItem.h"
@protocol RETableViewManagerDelegate;

View File

@@ -99,6 +99,7 @@
self[@"REPickerItem"] = @"RETableViewPickerCell";
self[@"RESegmentedItem"] = @"RETableViewSegmentedCell";
self[@"REInlineDatePickerItem"] = @"RETableViewInlineDatePickerCell";
self[@"REInlinePickerItem"] = @"RETableViewInlinePickerCell";
}
- (void)registerClass:(NSString *)objectClass forCellWithReuseIdentifier:(NSString *)identifier

View File

@@ -42,6 +42,8 @@
30939CF417949A10004D95A9 /* userpic6.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 30939CE817949A10004D95A9 /* userpic6.jpg */; };
30B00D7A17C667A90010D439 /* ValidationsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 30B00D7917C667A90010D439 /* ValidationsViewController.m */; };
30B35CEF17E54B670082CE0E /* RECommonFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 30B35CEE17E54B670082CE0E /* RECommonFunctions.m */; };
30B9914B18007035007C8913 /* RETableViewInlinePickerCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 30B9914A18007035007C8913 /* RETableViewInlinePickerCell.m */; };
30B9914E18007045007C8913 /* REInlinePickerItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 30B9914D18007045007C8913 /* REInlinePickerItem.m */; };
30BB805817E0D8A400AD0861 /* MultilineTextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 30BB805717E0D8A400AD0861 /* MultilineTextCell.m */; };
30BB805B17E0D8C300AD0861 /* XIBTestItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 30BB805A17E0D8C300AD0861 /* XIBTestItem.m */; };
30BB805E17E0D8E700AD0861 /* MultilineTextItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 30BB805D17E0D8E700AD0861 /* MultilineTextItem.m */; };
@@ -152,6 +154,10 @@
30B00D7917C667A90010D439 /* ValidationsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ValidationsViewController.m; sourceTree = "<group>"; };
30B35CED17E54AE30082CE0E /* RECommonFunctions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RECommonFunctions.h; sourceTree = "<group>"; };
30B35CEE17E54B670082CE0E /* RECommonFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RECommonFunctions.m; sourceTree = "<group>"; };
30B9914918007035007C8913 /* RETableViewInlinePickerCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RETableViewInlinePickerCell.h; sourceTree = "<group>"; };
30B9914A18007035007C8913 /* RETableViewInlinePickerCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RETableViewInlinePickerCell.m; sourceTree = "<group>"; };
30B9914C18007045007C8913 /* REInlinePickerItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = REInlinePickerItem.h; sourceTree = "<group>"; };
30B9914D18007045007C8913 /* REInlinePickerItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = REInlinePickerItem.m; sourceTree = "<group>"; };
30BB805617E0D8A400AD0861 /* MultilineTextCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultilineTextCell.h; sourceTree = "<group>"; };
30BB805717E0D8A400AD0861 /* MultilineTextCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MultilineTextCell.m; sourceTree = "<group>"; };
30BB805917E0D8C300AD0861 /* XIBTestItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XIBTestItem.h; sourceTree = "<group>"; };
@@ -394,6 +400,8 @@
30DBFA9317FC84380099ACA5 /* RETableViewPickerCell.m */,
3014617717FF1F6F000590A7 /* RETableViewInlineDatePickerCell.h */,
3014617817FF1F6F000590A7 /* RETableViewInlineDatePickerCell.m */,
30B9914918007035007C8913 /* RETableViewInlinePickerCell.h */,
30B9914A18007035007C8913 /* RETableViewInlinePickerCell.m */,
);
path = Cells;
sourceTree = "<group>";
@@ -425,6 +433,8 @@
30DBFA9017FC827D0099ACA5 /* REPickerItem.m */,
3014617A17FF1F8B000590A7 /* REInlineDatePickerItem.h */,
3014617B17FF1F8B000590A7 /* REInlineDatePickerItem.m */,
30B9914C18007045007C8913 /* REInlinePickerItem.h */,
30B9914D18007045007C8913 /* REInlinePickerItem.m */,
);
path = Items;
sourceTree = "<group>";
@@ -669,11 +679,13 @@
30D208641718FFDE00144E46 /* REMultipleChoiceItem.m in Sources */,
30E16A48171A103400F7C258 /* EditingViewController.m in Sources */,
30D74554174EB4CA00D4C7C1 /* RETableViewOptionCell.m in Sources */,
30B9914E18007045007C8913 /* REInlinePickerItem.m in Sources */,
3008EB1C17ECEB8B005D36D9 /* NSString+RETableViewManagerAdditions.m in Sources */,
30D9566C175E3C0200AB977E /* RetractableViewController.m in Sources */,
30FE4147176A306600F317B8 /* StylingViewController.m in Sources */,
303D966B17B7CCF800A418F3 /* XIBTestCell.m in Sources */,
303D967217B7CDE300A418F3 /* XIBTestViewController.m in Sources */,
30B9914B18007035007C8913 /* RETableViewInlinePickerCell.m in Sources */,
30E5F50C17BBD163005CF1FE /* IndexedListViewController.m in Sources */,
30BB805B17E0D8C300AD0861 /* XIBTestItem.m in Sources */,
30B00D7A17C667A90010D439 /* ValidationsViewController.m in Sources */,

View File

@@ -119,6 +119,13 @@
NSLog(@"Value: %@", item.value.description);
};
self.pickerItem = [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"]]];
// Use inline picker in iOS 7
//
if (REUIKitIsFlatMode()) {
self.pickerItem.inlineDatePicker = YES;
}
self.radioItem = [RERadioItem itemWithTitle:@"Radio" value:@"Option 4" selectionHandler:^(RERadioItem *item) {
[item deselectRowAnimated:YES]; // same as [weakSelf.tableView deselectRowAtIndexPath:item.indexPath animated:YES];