4

我需要在我的 iOS 应用程序中创建可扩展的列表视图,即。如果您点击一个单元格,它应该会扩展以提供更多单元格。我正在关注此链接上给出的示例:切换显示/隐藏子表格单元 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

4 回答 4

3

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

该示例从静态数据中提取,但您应该能够对其进行更新以使用数据库中的动态数据,并提供日期任务等。

于 2013-05-03T08:34:53.930 回答
2

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

查看示例应用程序。

截屏

于 2013-08-09T01:51:11.267 回答
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;
    }

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

于 2013-05-04T05:14:28.667 回答
0

在 Swift 4 中:

struct CellData {
    var isOpened = Bool()
    var title = String()
    var sectionData = [String]()
}

class TableViewController: UITableViewController {
    var tableViewData = [CellData]()
    override func viewDidLoad() {
        super.viewDidLoad()

        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem

        tableViewData = [CellData(isOpened: false, title: "title1", sectionData: ["cell1","cell2","cell3"]),CellData(isOpened: false, title: "title2", sectionData: ["cell1","cell2","cell3"]),CellData(isOpened: false, title: "title3", sectionData: ["cell1","cell2","cell3"])]
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return tableViewData.count
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        if tableViewData[section].isOpened {
            return tableViewData[section].sectionData.count + 1
        }
        return 1
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.row == 0 {
            guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell") else {
                return UITableViewCell()
            }
            cell.textLabel?.text = tableViewData[indexPath.section].title
            return cell
        } else {
            guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell") else {
                return UITableViewCell()
            }
            cell.textLabel?.text = tableViewData[indexPath.section].sectionData[indexPath.row - 1]
            return cell
        }
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if indexPath.row == 0 {
            if tableViewData[indexPath.section].isOpened {
                tableViewData[indexPath.section].isOpened = false
            }else {
                tableViewData[indexPath.section].isOpened = true
            }
            let sections = IndexSet(integer: indexPath.section)
            tableView.reloadSections(sections, with: .none)
        }
    }
}
于 2018-07-30T10:54:22.383 回答