我正在尝试按these images创建UITableView
。一个tableview可以包含多个部分及其标题。 Tableview可以包含多个节和行数。但是,在每个部分中只能选择一行。而且,稍后我可以在我的UIAlertView
中显示所选行作为消息,将部分显示为标题。我怎样才能做到这一点?
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"GroupCell"];
if (cell == nil)
{
cell = [tableView dequeueReusableCellWithIdentifier:@"GroupCell"];
}
if (indexPath.row == self.selectedCell)
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
cell.selected = YES;
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
cell.selected = NO;
}
cell.textLabel.text = @"mytext"
cell.textLabel.textColor = [UIColor blackColor];
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
self.selectedCell = indexPath.row;
[tableView reloadData]; // here i have to make the condition..
}
对此有何想法?或者至少在下面显示UITableView
图像也足够了..
答案 0 :(得分:2)
据我所知,您的部分数量是固定的。因此,当您选择行时,请检查该部分中的行数,并使用UITableViewCellAccessoryType
为nil表示行,并使用accessoryType
选中标记选择行。当天结束时,您必须检查每个部分中选择的行,并使用该部分的数据将其关闭。
希望这有帮助。
答案 1 :(得分:2)
对于要从每个部分中选择的行,您必须保留 selectedCell 的数组并且取消选择时间,您必须管理另一个单元格 isFirsttimeSelection 并为rowCollapse保留 boolArray 。
接口或头文件实现..
NSArray *sectionArray;
NSMutableDictionary *dictionary;
NSMutableArray *boolArray;
NSMutableArray *selectedCell;
NSMutableArray *isFirsttimeSelection;
查看要使用的数组和字典的初始化。
dictionary=[[NSMutableDictionary alloc] initWithObjectsAndKeys:[NSArray arrayWithObjects:@"Cat",@"Dog",@"Lion",@"Tiger",@"Elephant",nil],@"Animals",[NSArray arrayWithObjects:@"Swallow",@"Parrot",@"Eagle",@"Owl",nil],@"Birds",[NSArray arrayWithObjects:@"Banana",@"Mango",@"Grapes", nil],@"Fruits",nil];
sectionArray=[[NSArray alloc] initWithArray:[dictionary allKeys]];
boolArray=[[NSMutableArray alloc] init];
selectedCell=[[NSMutableArray alloc] init];
isFirsttimeSelection=[[NSMutableArray alloc] init];
for (int i=0;i<sectionArray.count;i++) {
[boolArray addObject:[NSNumber numberWithBool:NO]];
[isFirsttimeSelection addObject:[NSNumber numberWithInt:NO]];
[selectedCell addObject:[NSNumber numberWithInt:0]];
}
tableView数据源和委托用作:---
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return [sectionArray count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if ([boolArray[section] boolValue]) {
return [[dictionary valueForKey:[sectionArray objectAtIndex:section]] count];
}
return 0;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier=@"cellIdentifier";
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell==nil) {
cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
cell.accessoryType=((indexPath.row == [selectedCell[indexPath.section] intValue]) && ([isFirsttimeSelection[indexPath.section] intValue]==1))?UITableViewCellAccessoryCheckmark:UITableViewCellAccessoryNone;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.textLabel.text=[[dictionary valueForKey:[sectionArray objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 44;
}
部分的标题视图
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIButton *headerView=[UIButton buttonWithType:UIButtonTypeCustom];
[headerView setTitle:[sectionArray objectAtIndex:section] forState:UIControlStateNormal];
headerView.tag=section;
headerView.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
[headerView setTitleEdgeInsets:UIEdgeInsetsMake(0, 10, 0, 0)];
[headerView.titleLabel setFont:[UIFont boldSystemFontOfSize:16.0f]];
[headerView setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal];
[headerView setTitleShadowColor:[UIColor whiteColor] forState:UIControlStateNormal];
[headerView.titleLabel setShadowOffset:CGSizeMake(0, -1)];
[headerView addTarget:self action:@selector(sectionTouched:) forControlEvents:UIControlEventTouchUpInside];
return headerView;
}
点击标题视图上的操作
- (void)sectionTouched:(UIButton *)sender
{
[boolArray replaceObjectAtIndex:sender.tag withObject:[NSNumber numberWithBool:([boolArray[sender.tag] boolValue])?NO:YES]];
[_tblView reloadSections:[NSIndexSet indexSetWithIndex:sender.tag] withRowAnimation:([boolArray[sender.tag] boolValue])?UITableViewRowAnimationTop:UITableViewRowAnimationBottom];
}
最后选择了
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
selectedCell[indexPath.section] = [NSString stringWithFormat:@"%i",indexPath.row];
isFirsttimeSelection[indexPath.section]=[NSNumber numberWithBool:YES];
[tableView reloadData];
}
答案 2 :(得分:1)
保持一个NSIndexpaths
数组来处理选择哪一行,当用户选择检查时,部分索引已经在数组中并删除(如果存在)并且可以在cellForRowAtIndexpath
中管理选择,检查数组是否包含索引使用accessoryType
选择或不选择单元格,并在选择新行并正确管理时重新加载表
答案 3 :(得分:1)
尝试这样的事情。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell * selectedCell = [self.tableView cellForRowAtIndexPath:indexPath];
if (indexPath.section == 1)
{
selectedCell.accessoryType = UITableViewCellAccessoryCheckmark;
NSNumber * selectAnswer = [self.arrayWithObjects objectAtIndex:indexPath.row];
if (![self.selectedAnswers containsObject:selectAnswer])
{
[self.arrSelObj addObject:selectAnswer];
}
}
}
其中self.ArrayWithObjects
- 包含方法numberOfRows
中使用的元素的数组。
self.arrSelObj
- 数组而不是包含你的答案。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([self.arrSelObj containsObject:[self.arrayWithObjects objectAtIndex:indexPath.row]])
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
}
在didDeselect中:
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell * deselectedCell = [tableView cellForRowAtIndexPath:indexPath];
if (indexPath.section == 1)
{
deselectedCell.accessoryType = UITableViewCellAccessoryNone;
NSNumber * deselectAnswer = [self.arrayWithObjects objectAtIndex:indexPath.row];
[self.arrSelObj removeObject:deselectAnswer];
}
}
答案 4 :(得分:0)
你必须实现嵌套表OR如果它的列表(价格......)是固定的,那么只需使用逻辑:)就像三个按钮,当点击特定按钮然后设置表格框然后剩余按钮。 :)