iOS中的可扩展列表视图

时间:2013-05-03 08:08:43

标签: ios objective-c xcode4.5

我需要在iOS应用中创建可扩展的列表视图,即。如果你点击一个单元格,它应该扩展以提供更多的单元格。我按照此链接上提供的示例进行操作:Toggle showing/hiding child table cells iOS 此处还给出了实现文件的代码:http://pastie.org/7756763

但是,在上面的示例中,数组是固定的。我有一个sqlite数据库,我存储任务和开始日期等等。我需要创建一个可扩展的视图,其中不同的行是不同的开始日期,当我点击日期时,它应该给出该日期的任务。这是代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    allDates = [[NSMutableArray alloc]init];

    self.date = [[NSMutableArray alloc] initWithObjects: nil];
   // self.date = [[NSMutableArray alloc]init];
    self.listOfSections_DataSource = [[NSMutableArray alloc]initWithObjects:nil];

    sqlite3_stmt *statement;
    const char *dbpath = [mDatabasePath UTF8String];
    if (sqlite3_open(dbpath,&mDiary)== SQLITE_OK) {
        NSString *selectSQL = [NSString stringWithFormat:@"SELECT * FROM TODO"];
        const char *query_stmt = [selectSQL UTF8String];
        if (sqlite3_prepare_v2(mDiary,
                               query_stmt, -1, &statement, NULL) == SQLITE_OK)
        {
                    while(sqlite3_step(statement) == SQLITE_ROW)
            {
                tempTaskName = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)];
                [allDates addObject:[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]];

                [self.date addObject:tempTaskName];


            }

    }
    sqlite3_finalize(statement);
}
sqlite3_close(mDiary);

NSLog(@"%i",[allDates count]);

        for(int x = 0;x < [allDates count];x++)
        {
            if (sqlite3_open(dbpath,&mDiary)== SQLITE_OK) {
                NSString *selectSQL = [NSString stringWithFormat:@"SELECT * FROM TODO"];
                const char *query_stmt = [selectSQL UTF8String];

                if (sqlite3_prepare_v2(mDiary,
                                       query_stmt, -1, &statement, NULL) == SQLITE_OK){
            temp = [[NSMutableArray alloc]init];
            while(sqlite3_step(statement) == SQLITE_ROW)
            {
                tempTaskName = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)];
                NSLog(@"%@",tempTaskName);
               // [allDates addObject:[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]];
                if([[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)] isEqualToString:allDates[x]])
                {
                    [self.temp addObject:tempTaskName];
                }




            }
            NSLog(@"task name%@",temp);
            [listOfSections_DataSource addObject:temp];

                } sqlite3_finalize(statement);
            }
            sqlite3_close(mDiary);
        }

    //[self.listOfSections_DataSource addObject:allDates];

   NSMutableArray *emptyArray = [[NSMutableArray alloc]init];
   listOfSections = [[NSMutableArray alloc]init];
    for (int i = 0;i<[allDates count]; i++) {
        [listOfSections addObject:emptyArray];
    }  
    self.selectedSection = -1;
    self.selectedSectionTail = -1;
}

表视图方法是:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {


    return [listOfSections_DataSource count];


}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    if(selectedSection !=section)
        return 1;
    else{
        NSArray *array = [listOfSections objectAtIndex:section];

        return [array count];
    }

}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"cell";

    if(self.selectedSection == indexPath.section){//this is just to check to see if this section is the one we touched

        UITableViewCell *cell =  [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }

        NSArray *myArray = [listOfSections_DataSource objectAtIndex:indexPath.section];//this now contains your cities
        NSString* myString = [myArray objectAtIndex:indexPath.row]; // get city for that row, under the state

        cell.textLabel.text = myString;
        return cell;
    }
    else{//THIS IS going to happen the first time
        UITableViewCell *cell =  [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }

            cell.textLabel.text = @"more";

        return cell;
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {


    UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];

    //check to see if the cell is for exapnding or for selection
    if([cell.textLabel.text isEqualToString:@"more"]){ // this means we need to expand

        listOfSections = [[NSMutableArray alloc]init];
        //setting up the list of section with empty arrays

        NSMutableArray *emptyArray = [[NSMutableArray alloc]init];
        for (int i = 0;i<[allDates count]; i++) {
            [listOfSections addObject:emptyArray];
        }

        //Add array of tasks here
        [listOfSections replaceObjectAtIndex:indexPath.section withObject:[listOfSections_DataSource objectAtIndex:indexPath.section]];


        int tapedRow = [indexPath section];

        self.selectedSection = tapedRow;

        NSMutableIndexSet *myIndexSet = [[NSMutableIndexSet alloc]init];
        [myIndexSet addIndex:selectedSection];
        [myIndexSet addIndex:selectedSectionTail];

        // Updating section in the tableview
        if(selectedSectionTail!=-1)
            [taskTable reloadSections:(NSIndexSet*)myIndexSet withRowAnimation:UITableViewRowAnimationFade];
        else {
            [taskTable reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:
             UITableViewRowAnimationFade];
        }
        //[taskTable reloadData];
    }
    else{
    }
    selectedSectionTail = selectedSection;
}

这里的问题是: 1.屏幕上显示的部分数量是正确的,但是当轻敲第一个单元格时,它会消失。 2.当点击任何单元格时,列表不会被扩展。

请有人帮帮我吗?感谢..

4 个答案:

答案 0 :(得分:2)

此示例可能是您正在寻找的内容:http://developer.apple.com/library/ios/#samplecode/TableViewUpdates/Introduction/Intro.html

示例来自静态数据,但您应该能够更新它以使用数据库中的动态数据,还可以为日期等提供任务。

答案 1 :(得分:2)

JKExpandTableView是一个实现可扩展表视图(UITableView的子类)的开源库,可以帮助您: http://jackkwok.github.io/JKExpandTableView/

查看示例应用。

screenshot

答案 2 :(得分:1)

我需要的东西现在正在工作,所以我要在这里发布代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    BOOL flag = NO;
    allDates = [[NSMutableArray alloc]init];

    self.date = [[NSMutableArray alloc] init];
   // self.date = [[NSMutableArray alloc]init];
    self.listOfSections_DataSource = [[NSMutableArray alloc]init];

    sqlite3_stmt *statement;
    const char *dbpath = [mDatabasePath UTF8String];
    if (sqlite3_open(dbpath,&mDiary)== SQLITE_OK) {
        NSString *selectSQL = [NSString stringWithFormat:@"SELECT * FROM TODO"];
        const char *query_stmt = [selectSQL UTF8String];
        if (sqlite3_prepare_v2(mDiary,
                               query_stmt, -1, &statement, NULL) == SQLITE_OK)
        {
                    while(sqlite3_step(statement) == SQLITE_ROW)
            {
                tempTaskName = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)];

                [allDates addObject:[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]];

           //[self.date addObject:tempTaskName];


            }

    }
    sqlite3_finalize(statement);
}
    NSLog(@"%i",[allDates count]);
sqlite3_close(mDiary);
   self.date = [NSMutableArray arrayWithCapacity:[allDates count]];
    for(int p = 0; p < [allDates count]; p++)
    {
        for(int q = p+1; q < [allDates count]; q++)
        {
        if([allDates[p] isEqualToString:allDates[q]])
        {
            flag = YES;
            break;

        }
    }
        if(flag)
        {
            //[self.date addObject:allDates[p]];
            [allDates removeObjectAtIndex:p];
        }
        flag = NO;
    }
   // NSLog(@"%u",[self.date count]);
   // [allDates setArray:self.date];
NSLog(@"allDates count%i",[allDates count]);

        for(int x = 0;x < [allDates count];x++)
        {
            if (sqlite3_open(dbpath,&mDiary)== SQLITE_OK) {
                NSString *selectSQL = [NSString stringWithFormat:@"SELECT * FROM TODO"];
                const char *query_stmt = [selectSQL UTF8String];

                if (sqlite3_prepare_v2(mDiary,
                                       query_stmt, -1, &statement, NULL) == SQLITE_OK){
            temp = [[NSMutableArray alloc]init];
            while(sqlite3_step(statement) == SQLITE_ROW)
            {
                tempTaskName = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)];
                NSLog(@"%@",tempTaskName);

                if([[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)] isEqualToString:allDates[x]])
                {
                    [self.temp addObject:tempTaskName];
                }




            }
            NSLog(@"task name%@",temp);
            [listOfSections_DataSource addObject:temp];

                } sqlite3_finalize(statement);
            }
            sqlite3_close(mDiary);
        }

    //[self.listOfSections_DataSource addObject:allDates];

   NSMutableArray *emptyArray = [[NSMutableArray alloc]init];
   listOfSections = [[NSMutableArray alloc]init];
    for (int i = 0;i<[allDates count]; i++) {
        [listOfSections addObject:emptyArray];
    }  
    self.selectedSection = -1;
    self.selectedSectionTail = -1;
}

表格视图方法:

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {


        return [listOfSections_DataSource count];


    }


    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {


          if(selectedSection !=section)
            return 1;
        else{
            NSArray *array = [listOfSections objectAtIndex:section];

            return [array count]; 
        } 


}



    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

        for(int y = 0;y<[allDates count]; y++)
        {
            if (section == y) {
                return allDates[y];
            }
        }
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        static NSString *CellIdentifier = @"cell";

        if(self.selectedSection == indexPath.section){//this is just to check to see if this section is the one we touched

            UITableViewCell *cell =  [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
            if (cell == nil)
            {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            }

          //  cell.textLabel.text = [[listOfSections_DataSource objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
             NSArray *myArray = [listOfSections_DataSource objectAtIndex:indexPath.section];//tasks
            NSString* myString = [myArray objectAtIndex:indexPath.row]; // get task for that row, under the date

            cell.textLabel.text = myString; 
            return cell;
        }
        else{//THIS IS going to happen the first time
            UITableViewCell *cell =  [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
            if (cell == nil)
            {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            }

                cell.textLabel.text = @"more";

            return cell;
        }
    }

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {


        UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];

        //check to see if the cell is for exapnding or for selection
        if([cell.textLabel.text isEqualToString:@"more"]){ // this means we need to expand

            listOfSections = [[NSMutableArray alloc]init];
            //setting up the list of section with empty arrays

            NSMutableArray *emptyArray = [[NSMutableArray alloc]init];
            for (int i = 0;i<[allDates count]; i++) {
                [listOfSections addObject:emptyArray];
            }

            //Add array of tasks here
            [listOfSections replaceObjectAtIndex:indexPath.section withObject:[listOfSections_DataSource objectAtIndex:indexPath.section]];


            int tapedRow = [indexPath section];

            self.selectedSection = tapedRow;

            NSMutableIndexSet *myIndexSet = [[NSMutableIndexSet alloc]init];
            [myIndexSet addIndex:selectedSection];
            [myIndexSet addIndex:selectedSectionTail];

            // Updating section in the tableview
            if(selectedSectionTail!=-1)
                [taskTable reloadSections:(NSIndexSet*)myIndexSet withRowAnimation:UITableViewRowAnimationFade];
            else {
                [taskTable reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:
                 UITableViewRowAnimationFade];
            }
            //[taskTable reloadData];
        }
        else{
        }
        selectedSectionTail = selectedSection;
    }

我知道必须有更好的方法来做到这一点,但这个解决方案对我有用,所以我决定发布它。

答案 3 :(得分:0)

在Swift 4中:

{{1}}