在UITableView的每个部分select一行?
场景:
我在一个UITableView中创build了2个部分,用户需要在每个部分中select一行,如下面的截图所示。
预期结果:1.用户应该能够在每个部分中select一行
结果现在:1.在我select了一个行中的行,然后当我select第二个行中的行时,第一个select消失。
这是我的代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Uncheck the previous checked row long sec=indexPath.section; if(sec==0){ if(self->checkedIndexPath) { UITableViewCell* uncheckCell = [tableView cellForRowAtIndexPath:self->checkedIndexPath]; uncheckCell.accessoryType = UITableViewCellAccessoryNone; } if([self->checkedIndexPath isEqual:indexPath]) { self->checkedIndexPath = nil; } else { UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath]; cell.accessoryType = UITableViewCellAccessoryCheckmark; self->checkedIndexPath = indexPath; }} if(sec==1){ if(self->checkedIndexPath) { UITableViewCell* uncheckCell = [tableView cellForRowAtIndexPath:self->checkedIndexPath]; uncheckCell.accessoryType = UITableViewCellAccessoryNone; } if([self->checkedIndexPath isEqual:indexPath]) { self->checkedIndexPath = nil; } else { UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath]; cell.accessoryType = UITableViewCellAccessoryCheckmark; self->checkedIndexPath = indexPath; } } }
帮助表示赞赏。
这是最简单的方法。 最后我find了解决scheme。 它适用于我,希望它会为你工作。 宣布这些
@interface ViewController () { int selectedsection; NSMutableArray *selectedindex; }
将didSelectRowAtIndexPathreplace成如下所示:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Uncheck the previous checked row NSIndexPath *selectedIndexPath = [tableView indexPathForSelectedRow]; if(self.checkedIndexPath) { for (int i=0; i<[selectedindex count]; i++) { NSIndexPath *temp= [selectedindex objectAtIndex:i]; if (temp.section==selectedIndexPath.section) { UITableViewCell* uncheckCell = [tableView cellForRowAtIndexPath:temp]; uncheckCell.accessoryType = UITableViewCellAccessoryNone; } } NSInteger numb= [tableView numberOfRowsInSection:selectedIndexPath.section]; if (selectedsection==selectedIndexPath.section) { UITableViewCell* uncheckCell = [tableView cellForRowAtIndexPath:self.checkedIndexPath]; uncheckCell.accessoryType = UITableViewCellAccessoryNone; } } if([self.checkedIndexPath isEqual:indexPath]) { for (int i=0; i<[selectedindex count]; i++) { NSIndexPath *temp= [selectedindex objectAtIndex:i]; if (temp.section==selectedIndexPath.section) { UITableViewCell* uncheckCell = [tableView cellForRowAtIndexPath:temp]; uncheckCell.accessoryType = UITableViewCellAccessoryNone; } } self.checkedIndexPath = nil; } else { for (int i=0; i<[selectedindex count]; i++) { NSIndexPath *temp= [selectedindex objectAtIndex:i]; if (temp.section==selectedIndexPath.section) { UITableViewCell* uncheckCell = [tableView cellForRowAtIndexPath:temp]; uncheckCell.accessoryType = UITableViewCellAccessoryNone; } } UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath]; cell.accessoryType = UITableViewCellAccessoryCheckmark; self.checkedIndexPath = indexPath; [selectedindex addObject:indexPath]; selectedsection=indexPath.section; NSLog(@"check"); } }
你可以在tableview中启用多项select:
self.tableView.allowsMultipleSelection = YES;
我写了一个示例代码,其中一个复合数据源保存每个部分的数据源对象。 听起来很复杂,但实际上提供了一个易于扩展的架构。 并保持你的视图控制器小。
这种方法的优点:
- 小的ViewController
- ViewController设置视图和处理用户交互 – 它应该在MVC中
- 可重用的数据源
- 通过使用不同的数据源,每个部分容易定制每个部分的单元格
基础数据源体系结构
这提供了简单的扩展并且易于重用。
@import UIKit; @interface ComoundTableViewDataSource : NSObject @property (nonatomic,strong, readonly) NSMutableDictionary *internalDictionary; -(void) setDataSource:(id<UITableViewDataSource>)dataSource forSection:(NSUInteger)section; -(instancetype)initWithTableView:(UITableView *)tableView; @end
#import "ComoundTableViewDataSource.h" @interface ComoundTableViewDataSource () <UITableViewDataSource> @property (nonatomic,strong, readwrite) NSMutableDictionary *internalDictionary; @property (nonatomic, weak) UITableView *tableView; @end @implementation ComoundTableViewDataSource -(instancetype)initWithTableView:(UITableView *)tableView { self = [super init]; if (self) { _tableView = tableView; tableView.dataSource = self; _internalDictionary = [@{} mutableCopy]; [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"]; } return self; } -(void)setDataSource:(id<UITableViewDataSource>)dataSource forSection:(NSUInteger)section { self.internalDictionary[@(section)] = dataSource; [self.tableView reloadData]; } -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [[self.internalDictionary allKeys] count]; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { id<UITableViewDataSource> sectionDataSource = self.internalDictionary[@(section)]; return [sectionDataSource tableView:tableView numberOfRowsInSection:section]; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { id<UITableViewDataSource> sectionDataSource = self.internalDictionary[@(indexPath.section)]; return [sectionDataSource tableView:tableView cellForRowAtIndexPath:indexPath]; } -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { id<UITableViewDataSource> sectionDataSource = self.internalDictionary[@(section)]; return [sectionDataSource tableView:tableView titleForHeaderInSection:section]; } @end
@import UIKit; @interface SingleSectionDataSource : NSObject <UITableViewDataSource> @property (nonatomic, strong, readonly) NSArray *array; @property (nonatomic, strong, readonly) UITableView *tableView; - (instancetype)initWithArray:(NSArray *)array; @end
#import "SingleSectionDataSource.h" @interface SingleSectionDataSource () @property (nonatomic, strong, readwrite) NSArray *array; @property (nonatomic, strong, readwrite) UITableView *tableView; @end @implementation SingleSectionDataSource - (instancetype)initWithArray:(NSArray *)array { self = [super init]; if (self) { self.array = array; } return self; } -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { self.tableView = tableView; return self.array.count; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; cell.textLabel.text = self.array[indexPath.row]; return cell; } -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { return [@(section) stringValue]; } @end
select数据源结构
我们从上面扩展类,以允许每个部分select一个
#import "ComoundTableViewDataSource.h" @interface OnSelectionPerSectionComoundTableViewDataSource : ComoundTableViewDataSource -(void)selectedCellAtIndexPath:(NSIndexPath *)indexPath; @end
#import "OnSelectionPerSectionComoundTableViewDataSource.h" #import "SingleSelectionSingleSectionDataSource.h" @implementation OnSelectionPerSectionComoundTableViewDataSource -(instancetype)initWithTableView:(UITableView *)tableView { self = [super initWithTableView:tableView]; if(self){ [tableView setAllowsMultipleSelection:YES]; } return self; } -(void)selectedCellAtIndexPath:(NSIndexPath *)indexPath { SingleSelectionSingleSectionDataSource *sectionDataSource = self.internalDictionary[@(indexPath.section)]; [sectionDataSource selectedCellAtIndexPath:indexPath]; } @end
视图控制器实现
如所承诺的,一个非常苗条的视图控制器:
@interface ViewController () <UITableViewDelegate> @property (weak, nonatomic) IBOutlet UITableView *tableView; @property (nonatomic, strong) OnSelectionPerSectionComoundTableViewDataSource *tableViewDataSource; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.tableViewDataSource = [[OnSelectionPerSectionComoundTableViewDataSource alloc] initWithTableView:self.tableView]; self.tableView.delegate = self; [self.tableViewDataSource setDataSource:[[SingleSelectionSingleSectionDataSource alloc] initWithArray:@[@"Hallo", @"Welt"]] forSection:0]; [self.tableViewDataSource setDataSource:[[SingleSelectionSingleSectionDataSource alloc] initWithArray:@[@"Hello", @"World", @"!"]] forSection:1]; [self.tableViewDataSource setDataSource:[[SingleSelectionSingleSectionDataSource alloc] initWithArray:@[@"Hola", @"Mundo", @"!", @"¿Que tal?"]] forSection:2]; } -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self.tableViewDataSource selectedCellAtIndexPath:indexPath]; } @end
您将需要添加方法到数据源来获取选定的行。
得到这个例子: https : //github.com/vikingosegundo/CompoundDatasourceExample
注意此代码有一个单元重用问题。 它固定在GitHub上。