2012-08-06 65 views
0

我有一個類似的tableview ..的UITableView - 插入行和滾動到一個特定章節

enter image description here

細胞XXXX,YYYY & ZZZZ是固定的,所以,沒有點擊的動作給他們。但單元格「顯示」是可點擊的。點擊時,我想在「顯示」單元格下顯示六個單元格。

所以,單擊 「顯示」 電池後,該表將看起來像..

enter image description here

在這裏,我做的是,

  • 改變cell.textLabel.text 「秀」到「隱藏」

  • 使用[tableView reloadData];tableView:didSelectRowAtIndexPath:方法。

我的代碼是:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.title = @"My title"; 
    // This Mutable array contains the hided cell objects 
    hidedCellsArray = [[NSMutableArray alloc] initWithObjects:@"Cell 1", @"Cell 2", @"Cell 3", @"Cell 4", @"Cell 5", @"Cell 6", nil]; 
} 


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

else if(indexPath.section == 1) 
    { 
     if (isShowClicked) //isShowClicked is a boolean value that determines whether the show cell was clicked or not 
     { 
      if (indexPath.row == 0) 
      { 
       cell.textLabel.text = @"Hide"; 
       cell.selectionStyle = UITableViewCellSelectionStyleBlue; 
       cell.textLabel.textAlignment=UITextAlignmentCenter; 
      } 

      else 
      { 
       cell.textLabel.text = [hidedCellsArray objectAtIndex:indexPath.row-1]; 
       cell.selectionStyle = UITableViewCellSelectionStyleBlue; 
       cell.textLabel.textAlignment=UITextAlignmentCenter; 
      } 
     } 

     else 
     { 
      cell.textLabel.text = @"Show"; 
      cell.selectionStyle = UITableViewCellSelectionStyleBlue; 
      cell.textLabel.textAlignment=UITextAlignmentCenter; 
     } 
    } 
... 
return cell; 
} 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.section == 1) 
    { 
     if (isShowClicked) 
     { 
      isShowClicked = NO; 
     } 

     else 
     { 
      isShowClicked = YES; 
     } 

     [tableView reloadData]; 
    } 
} 

我需要什麼:

  • 我想動畫的細胞,當我點擊顯示/隱藏按鈕。我開始知道,應該使用insertRowsAtIndexPaths: withRowAnimation:方法來實現插入效果。但我真的沒有看到任何簡單的例子。我是否應該包含其他方法,如setEditing:animated:tableView: commitEditingStyle: forRowAtIndexPath:方法來做到這一點?

  • 第二件事是,在動畫(單元格插入)發生之前,我想將tableview移動到第2節(也就是「show」單元格)頂部。然後插入單元格的動畫應該會發生。因此,該表的單擊顯示電池後的最終外觀應如..

enter image description here

需要幫助..我只是困惑!

回答

2

嘗試的第一部分,你可以Table View Programming Guide for iOS下檢查「批量插入,刪除和行和部分重裝」一節。最重要的是你需要確保你的數據源與變化相匹配。

對於第二個問題,您可以將表視圖的contentOffset設置爲第二節標題的原點。喜歡的東西:

self.tableView.contentOffset = CGPointMake(0, [self.tableView rectForSection:1].origin.y); 

如果您想使用的動畫更好的UE,只是做

[UIView animateWithDuration:duration animations:^{ 
    //Move table view to where you want 
} completion:^(BOOL finished){ 
    //insert rows when table view movement animation finish 
}]; 
0

不是雞蛋裏挑骨頭,但「hidedArray」確實應該「hiddenArray」,對於語法的正確性。 無論如何,我不認爲你需要一個單獨的數組爲隱藏的項目。爲了舉例,假設您使用「dataArray」來填充tableview。

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

    if ((indexpath.section == 1) && (indexpath.row == 0)) { 
      if (isShowClicked) { 
      cell.textLabel.text = @"Hide"; 
      cell.selectionStyle = UITableViewCellSelectionStyleBlue; 
      cell.textLabel.textAlignment=UITextAlignmentCenter; 
      } else { 
      cell.textLabel.text = @"Show"; 
      cell.selectionStyle = UITableViewCellSelectionStyleBlue; 
      cell.textLabel.textAlignment=UITextAlignmentCenter; 
      } 
     } 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if ((indexpath.section == 1) && (indexpath.row == 0) && (isShowClicked == NO)) { 
    isShowClicked = YES; 
    [self.tableView beginUpdates]; 
    [dataArray addObjectsFromArray:[NSArray arrayWithObjects:@"cell1",@"cell2",@"cell3",@"cell4",@"cell5",@"cell6", nil]]; 
    NSArray *paths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:[dataArray count]-1 inSection:1]]; 
    //the first section is section 0, so this is actually the second one 
    [[self tableView] insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationFade]; 
    [tableView endUpdates]; 
    showIsClicked = YES; 
    self.tableview.contentOffset = xy; 
    //the value of the tableView's contentOffset when it is scrolled to the right position. You can get it by NSLog-ing the contentOffset property and scrolling to the desired position 
    } else if ((indexpath.section == 1) && (indexpath.row == 0) && (isShowClicked == YES)) { 
    isShowClicked = NO; 
    [self.tableView beginUpdates]; 
     [array removeObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(indexpath.row + 1, 6)]]; 

    [tableView endUpdates]; 
    self.tableview.contentOffset = xy; 
    //the value of the tableView's contentOffset when it is scrolled to the right position. You can get it by NSLog-ing the contentOffset property and scrolling to the desired position 
    } 
} 

可能有一些錯誤,但我認爲它大部分是正確的。