简体   繁体   中英

Hide or move seleted Cell and load a new custom Cell in that indexPath.row in UItableView

I have a UITableView call myTableView with two custom UITableViewCell call TableViewCell & ExTableViewCell . What I want is, when user tap on a cell, the existing cell TableViewCell will hide/move and ExTableViewCell is loaded in that indexpath.row and when tap on that indexpath.row again it hide ExTableViewCell and bring back the old TableViewCell in that position.

Here is my code:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.myArray = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", @"four", @"five", @"six", nil];
    selectedIndex = -1;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (selectedIndex == indexPath.row)
    {
        return 230;
    }
    else
    {
        return 40;
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.myArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    TableViewCell *Cell = (TableViewCell *)[self.myTableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (!Cell)
    {
        Cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    Cell.myLabel.text = [self.myArray objectAtIndex:indexPath.row];



    if (selectedIndex == indexPath.row)
    {
        static NSString *CellIdentifier = @"CellEx";
        ExTableViewCell *Cell = (ExTableViewCell *)[self.myTableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (!Cell)
        {
            Cell = [[ExTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
        Cell.backgroundColor = [UIColor redColor];
        Cell.exLabel.text = [self.myArray objectAtIndex:indexPath.row];
    }
    else
    {
        // Do close cell stuff
        //Cell.backgroundColor = [UIColor clearColor];
    }

    return Cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Expand row when user taps row
    if (selectedIndex == indexPath.row)
    {
        selectedIndex = -1;
        [self.myTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:  UITableViewRowAnimationFade];

        return;
    }

    // When user taps different row
    if (selectedIndex != -1)
    {
        NSIndexPath *prevPath = [NSIndexPath indexPathForRow:selectedIndex inSection:0];
        selectedIndex = indexPath.row;
        [self.myTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:prevPath] withRowAnimation:UITableViewRowAnimationFade];
    }

    // When user taps new row with none expanded
    selectedIndex = indexPath.row;
    [self.myTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}

But for some reason in the ExTableViewCell label is not showing any text. And the ExTableViewCell is still top of it. How can I achieve this?

A lot a thanks for advance. Have a good day. :)

This is the out put:

在此处输入图片说明

My problem:

在此处输入图片说明

You don't need to 'hide' the old cell in order to show the new one, you just reload the proper content at the desired index path. Something like this:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    if ([self.selectedPath isEqual:indexPath]) {
        //configure the extended cell
        cell = [tableView dequeueReusableCellWithIdentifier:@"CellEx" forIndexPath:indexPath];
        ...
    } else {
        //configure the default cell
    }
}

And here is how to handle the selected/deselected state:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSIndexPath *oldPath = [self.selectedPath copy];
    self.selectedPath = indexPath;
    NSArray *paths = @[indexPath];
    if (oldPath && ![oldPath isEqual:indexPath]) {
        paths = [paths arrayByAddingObject:oldPath];
    } else if ([oldPath isEqual:indexPath]){
        self.selectedPath = nil;
    }
    [self.tableView beginUpdates];
    [self.tableView reloadRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.tableView endUpdates];
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM