0

私は..のようなテーブルビューを持っています

ここに画像の説明を入力

セル xxxx、yyyy、zzzz は固定されているため、クリック アクションはありません。ただし、セル「表示」はクリック可能です。「表示」セルをクリックすると、その下に6つのセルが表示されます。

したがって、「表示」セルをクリックすると、表は次のようになります。

ここに画像の説明を入力

ここで、私がやったことは、

  • 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:ありますか?

  • 2 つ目は、アニメーション (セルの挿入) が発生する前に、テーブルビューをセクション 2 (つまり、「表示」セル) に移動したいということです。次に、セルを挿入するアニメーションが発生するはずです。したがって、表示セルをクリックした後のテーブルの最終的な外観は、..

ここに画像の説明を入力

助けが必要..私はただ混乱しました!!

4

3 に答える 3

2

最初の部分については、「 Table View Programming Guide for iOS」の「Batch Insertion, Deletion, and Reloading of Rows and Sections」セクションを確認できます。最も重要なことは、データ ソースが変更と一致していることを確認する必要があることです。

2 番目の問題についてはcontentOffset、テーブル ビューの を 2 番目のセクション タイトルの原点に設定できます。何かのようなもの:

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
}];
于 2012-08-06T21:39:09.623 に答える
0

試してみてください UIView CommitAnimation

于 2012-08-06T20:46:34.417 に答える
0

つまらないことではありませんが、文法上の正確さのために、「hidedArray」は実際には「hiddenArray」である必要があります。とにかく、隠しアイテム用に別の配列は必要ないと思います。例として、「dataArray」を使用してテーブルビューにデータを入力するとします。

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

多少の誤差はあるかもしれませんが、おおむね正しいと思います。

于 2012-08-06T21:46:19.630 に答える