创建自定义UITableView

时间:2013-07-25 06:14:18

标签: iphone ios uitableview

我正在尝试按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图像也足够了..

enter image description here

5 个答案:

答案 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];
}

Download it.

答案 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如果它的列表(价格......)是固定的,那么只需使用逻辑:)就像三个按钮,当点击特定按钮然后设置表格框然后剩余按钮。 :)