2013-05-03 118 views
3

我需要在iOS應用中創建可擴展列表視圖,即。如果你點擊一個單元格,它應該擴大以提供更多的單元格。我正在關注此鏈接中給出的示例:Toggle showing/hiding child table cells iOS 此處給出了實現文件的代碼:http://pastie.org/7756763iOS中的可擴展列表視圖

但是,在上面的示例中,數組是固定的。我有一個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.當任何單元被點擊時,列表不會被展開。

請任何人都可以幫我嗎?謝謝..

回答

2

該樣品可能是你在找什麼:http://developer.apple.com/library/ios/#samplecode/TableViewUpdates/Introduction/Intro.html

樣品從靜態數據拉,但你應該能夠更新它從你的數據庫使用動態數據,也給該任務的日期,等

+0

感謝..但我已經通過這個走了..它從一個plist中舉人的數據,而不是從一個陣列 – 2013-05-03 09:17:08

+0

@ Crazed'n'Dazed使用的.plist你有NSDictionary中加載它,並且我想NSDictionary在提供的例子中有一些NSArray。您應該再次檢查它 – 2013-05-03 09:48:39

+0

您也可以修改樣本以從Array讀取而不是plist。 – canhazbits 2013-05-03 17:07:14

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; 
    } 

我知道必須有更好的方法來做到這一點,但這種解決方案爲我工作,所以我決定發佈它。