From cb2cec9cf5318dc99ce79969caa745f93075a303 Mon Sep 17 00:00:00 2001 From: Roman Efimov Date: Wed, 27 Mar 2013 16:23:27 -0500 Subject: [PATCH] Add ability to assign actions for accessoryButton --- RETableViewManager/Items/REStringItem.h | 9 ++++---- RETableViewManager/Items/REStringItem.m | 21 ++++++++++++------- RETableViewManager/RETableViewItem.h | 1 + RETableViewManager/RETableViewManager.h | 2 ++ RETableViewManager/RETableViewManager.m | 17 +++++++++++++++ .../ControlsViewController.m | 16 ++++++++------ .../RootViewController.m | 8 +++---- 7 files changed, 53 insertions(+), 21 deletions(-) diff --git a/RETableViewManager/Items/REStringItem.h b/RETableViewManager/Items/REStringItem.h index d6b9348..54d74d6 100644 --- a/RETableViewManager/Items/REStringItem.h +++ b/RETableViewManager/Items/REStringItem.h @@ -30,9 +30,10 @@ @property (assign, nonatomic) UITableViewCellAccessoryType accessoryType; @property (strong, nonatomic) UIView *accessoryView; -+ (id)itemWithTitle:(NSString *)title actionBlock:(void(^)(RETableViewItem *item))actionBlock accessoryType:(UITableViewCellAccessoryType)accessoryType; -+ (id)itemWithTitle:(NSString *)title actionBlock:(void(^)(RETableViewItem *item))actionBlock accessoryType:(UITableViewCellAccessoryType)accessoryType accessoryView:(UIView *)accessoryView; -- (id)initWithTitle:(NSString *)title actionBlock:(void(^)(RETableViewItem *item))actionBlock accessoryType:(UITableViewCellAccessoryType)accessoryType; -- (id)initWithTitle:(NSString *)title actionBlock:(void(^)(RETableViewItem *item))actionBlock accessoryType:(UITableViewCellAccessoryType)accessoryType accessoryView:(UIView *)accessoryView; ++ (id)itemWithTitle:(NSString *)title accessoryType:(UITableViewCellAccessoryType)accessoryType actionBlock:(void(^)(RETableViewItem *item))actionBlock; ++ (id)itemWithTitle:(NSString *)title accessoryType:(UITableViewCellAccessoryType)accessoryType accessoryView:(UIView *)accessoryView actionBlock:(void(^)(RETableViewItem *item))actionBlock; ++ (id)itemWithTitle:(NSString *)title accessoryType:(UITableViewCellAccessoryType)accessoryType actionBlock:(void(^)(RETableViewItem *item))actionBlock accessoryButtonActionBlock:(void(^)(RETableViewItem *item))accessoryButtonActionBlock; +- (id)initWithTitle:(NSString *)title accessoryType:(UITableViewCellAccessoryType)accessoryType actionBlock:(void(^)(RETableViewItem *item))actionBlock accessoryButtonActionBlock:(void(^)(RETableViewItem *item))accessoryButtonActionBlock; +- (id)initWithTitle:(NSString *)title accessoryType:(UITableViewCellAccessoryType)accessoryType accessoryView:(UIView *)accessoryView actionBlock:(void(^)(RETableViewItem *item))actionBlock accessoryButtonActionBlock:(void(^)(RETableViewItem *item))accessoryButtonActionBlock; @end diff --git a/RETableViewManager/Items/REStringItem.m b/RETableViewManager/Items/REStringItem.m index 1a000d4..d38549a 100644 --- a/RETableViewManager/Items/REStringItem.m +++ b/RETableViewManager/Items/REStringItem.m @@ -27,22 +27,28 @@ @implementation REStringItem -+ (id)itemWithTitle:(NSString *)title actionBlock:(void(^)(RETableViewItem *item))actionBlock accessoryType:(UITableViewCellAccessoryType)accessoryType ++ (id)itemWithTitle:(NSString *)title accessoryType:(UITableViewCellAccessoryType)accessoryType actionBlock:(void(^)(RETableViewItem *item))actionBlock { - return [[REStringItem alloc] initWithTitle:title actionBlock:actionBlock accessoryType:accessoryType accessoryView:nil]; + return [[REStringItem alloc] initWithTitle:title accessoryType:accessoryType accessoryView:nil actionBlock:actionBlock accessoryButtonActionBlock:nil]; } -+ (id)itemWithTitle:(NSString *)title actionBlock:(void(^)(RETableViewItem *item))actionBlock accessoryType:(UITableViewCellAccessoryType)accessoryType accessoryView:(UIView *)accessoryView + ++ (id)itemWithTitle:(NSString *)title accessoryType:(UITableViewCellAccessoryType)accessoryType accessoryView:(UIView *)accessoryView actionBlock:(void(^)(RETableViewItem *item))actionBlock { - return [[REStringItem alloc] initWithTitle:title actionBlock:actionBlock accessoryType:accessoryType accessoryView:accessoryView]; + return [[REStringItem alloc] initWithTitle:title accessoryType:accessoryType accessoryView:accessoryView actionBlock:actionBlock accessoryButtonActionBlock:nil]; } -- (id)initWithTitle:(NSString *)title actionBlock:(void(^)(RETableViewItem *item))actionBlock accessoryType:(UITableViewCellAccessoryType)accessoryType; ++ (id)itemWithTitle:(NSString *)title accessoryType:(UITableViewCellAccessoryType)accessoryType actionBlock:(void(^)(RETableViewItem *item))actionBlock accessoryButtonActionBlock:(void(^)(RETableViewItem *item))accessoryButtonActionBlock { - return [self initWithTitle:title actionBlock:actionBlock accessoryType:accessoryType accessoryView:nil]; + return [[REStringItem alloc] initWithTitle:title accessoryType:accessoryType actionBlock:actionBlock accessoryButtonActionBlock:accessoryButtonActionBlock]; } -- (id)initWithTitle:(NSString *)title actionBlock:(void(^)(RETableViewItem *item))actionBlock accessoryType:(UITableViewCellAccessoryType)accessoryType accessoryView:(UIView *)accessoryView +- (id)initWithTitle:(NSString *)title accessoryType:(UITableViewCellAccessoryType)accessoryType actionBlock:(void(^)(RETableViewItem *item))actionBlock accessoryButtonActionBlock:(void(^)(RETableViewItem *item))accessoryButtonActionBlock +{ + return [self initWithTitle:title accessoryType:accessoryType accessoryView:nil actionBlock:actionBlock accessoryButtonActionBlock:accessoryButtonActionBlock]; +} + +- (id)initWithTitle:(NSString *)title accessoryType:(UITableViewCellAccessoryType)accessoryType accessoryView:(UIView *)accessoryView actionBlock:(void(^)(RETableViewItem *item))actionBlock accessoryButtonActionBlock:(void(^)(RETableViewItem *item))accessoryButtonActionBlock { self = [super init]; if (!self) @@ -53,6 +59,7 @@ self.accessoryView = accessoryView; self.actionBlock = actionBlock; self.performActionOnSelection = YES; + self.accessoryButtonActionBlock = accessoryButtonActionBlock; return self; } diff --git a/RETableViewManager/RETableViewItem.h b/RETableViewManager/RETableViewItem.h index 1f397d8..3e8ea9b 100644 --- a/RETableViewManager/RETableViewItem.h +++ b/RETableViewManager/RETableViewItem.h @@ -32,6 +32,7 @@ @property (copy, readwrite, nonatomic) NSString *title; @property (copy, readwrite, nonatomic) void (^actionBlock)(id item); +@property (copy, readwrite, nonatomic) void (^accessoryButtonActionBlock)(id item); @property (assign, readwrite, nonatomic) BOOL performActionOnSelection; @property (assign, readonly, nonatomic) BOOL canFocus; @property (weak, readwrite, nonatomic) RETableViewSection *section; diff --git a/RETableViewManager/RETableViewManager.h b/RETableViewManager/RETableViewManager.h index f82d0a6..2116c08 100644 --- a/RETableViewManager/RETableViewManager.h +++ b/RETableViewManager/RETableViewManager.h @@ -94,6 +94,8 @@ - (void)tableView:(UITableView *)tableView styleCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath; - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath; - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath item:(id)items; +- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath; +- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath item:(id)items; @end diff --git a/RETableViewManager/RETableViewManager.m b/RETableViewManager/RETableViewManager.m index d422d2e..21bd4c4 100644 --- a/RETableViewManager/RETableViewManager.m +++ b/RETableViewManager/RETableViewManager.m @@ -192,6 +192,23 @@ [_delegate tableView:tableView didSelectRowAtIndexPath:indexPath item:item]; } +- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath +{ + RETableViewSection *section = [_sections objectAtIndex:indexPath.section]; + id item = [section.items objectAtIndex:indexPath.row]; + if ([item respondsToSelector:@selector(setActionBlock:)]) { + RETableViewItem *actionItem = (RETableViewItem *)item; + if (actionItem.accessoryButtonActionBlock) + actionItem.accessoryButtonActionBlock(item); + } + + if ([_delegate respondsToSelector:@selector(tableView:accessoryButtonTappedForRowWithIndexPath:)]) + [_delegate tableView:tableView accessoryButtonTappedForRowWithIndexPath:indexPath]; + + if ([_delegate respondsToSelector:@selector(tableView:accessoryButtonTappedForRowWithIndexPath:item:)]) + [_delegate tableView:tableView accessoryButtonTappedForRowWithIndexPath:indexPath item:item]; +} + @end #pragma mark - diff --git a/RETableViewManagerExample/RETableViewManagerExample/ControlsViewController.m b/RETableViewManagerExample/RETableViewManagerExample/ControlsViewController.m index b3c897e..38913ee 100644 --- a/RETableViewManagerExample/RETableViewManagerExample/ControlsViewController.m +++ b/RETableViewManagerExample/RETableViewManagerExample/ControlsViewController.m @@ -54,17 +54,21 @@ section = [[RETableViewSection alloc] initWithHeaderTitle:@"Accessories"]; [_manager addSection:section]; - [section addItem:[REStringItem itemWithTitle:@"Accessory 1" actionBlock:^(RETableViewItem *item) { + [section addItem:[REStringItem itemWithTitle:@"Accessory 1" accessoryType:UITableViewCellAccessoryDisclosureIndicator actionBlock:^(RETableViewItem *item) { [weakSelf.tableView deselectRowAtIndexPath:item.indexPath animated:YES]; - } accessoryType:UITableViewCellAccessoryDisclosureIndicator]]; + }]]; - [section addItem:[REStringItem itemWithTitle:@"Accessory 2" actionBlock:^(RETableViewItem *item) { + REStringItem *accessoryItem2 = [REStringItem itemWithTitle:@"Accessory 2" accessoryType:UITableViewCellAccessoryDetailDisclosureButton actionBlock:^(RETableViewItem *item) { [weakSelf.tableView deselectRowAtIndexPath:item.indexPath animated:YES]; - } accessoryType:UITableViewCellAccessoryDetailDisclosureButton]]; + }]; + accessoryItem2.accessoryButtonActionBlock = ^(RETableViewItem *item) { + NSLog(@"Accessory button in accessoryItem2 was tapped"); + }; + [section addItem:accessoryItem2]; - [section addItem:[REStringItem itemWithTitle:@"Accessory 2" actionBlock:^(RETableViewItem *item) { + [section addItem:[REStringItem itemWithTitle:@"Accessory 2" accessoryType:UITableViewCellAccessoryCheckmark actionBlock:^(RETableViewItem *item) { [weakSelf.tableView deselectRowAtIndexPath:item.indexPath animated:YES]; - } accessoryType:UITableViewCellAccessoryCheckmark]]; + }]]; // Set delegate and datasource // diff --git a/RETableViewManagerExample/RETableViewManagerExample/RootViewController.m b/RETableViewManagerExample/RETableViewManagerExample/RootViewController.m index e734b6d..aeac6c1 100644 --- a/RETableViewManagerExample/RETableViewManagerExample/RootViewController.m +++ b/RETableViewManagerExample/RETableViewManagerExample/RootViewController.m @@ -30,13 +30,13 @@ RETableViewSection *section = [[RETableViewSection alloc] init]; [_manager addSection:section]; - [section addItem:[REStringItem itemWithTitle:@"Forms" actionBlock:^(RETableViewItem *item) { + [section addItem:[REStringItem itemWithTitle:@"Forms" accessoryType:UITableViewCellAccessoryDisclosureIndicator actionBlock:^(RETableViewItem *item) { [weakSelf.navigationController pushViewController:[[ControlsViewController alloc] initWithStyle:UITableViewStyleGrouped] animated:YES]; - } accessoryType:UITableViewCellAccessoryDisclosureIndicator]]; + }]]; - [section addItem:[REStringItem itemWithTitle:@"List" actionBlock:^(RETableViewItem *item) { + [section addItem:[REStringItem itemWithTitle:@"List" accessoryType:UITableViewCellAccessoryDisclosureIndicator actionBlock:^(RETableViewItem *item) { [weakSelf.navigationController pushViewController:[[ListViewController alloc] initWithStyle:UITableViewStylePlain] animated:YES]; - } accessoryType:UITableViewCellAccessoryDisclosureIndicator]]; + }]]; // Set delegate and datasource //