-1

假设有不同 Height 的自定义单元格 A 和B。
自定义单元格 A 在 UITableView 上加载默认值。当用户选择单元格 A时,它将删除该单元格并将单元格 B添加到该位置,反之亦然。它将以Accordion 风格进行重新调整大小的动画。

4

3 回答 3

5

为此,您应该在数据数组中有一个属性(或键,如果使用字典)来跟踪每个 indexPath 中您想要的单元格,并在 cellFroRowAtIndexPath 中使用 if-else 语句来使正确的单元格出列。在 didSelectRowAtIndexPath 中,您将检查该属性,将其设置为相反的属性,然后重新加载表。您还需要实现 heightForRowAtIndexPath,并检查相同的属性以确定要返回的高度。

编辑后:

如果您只需要跟踪一个选定的单元格,则创建一个属性(我称之为 selectedPath)来保存该值并在 heightForRowAtIndexPath 和 cellForRowAtIndexPath 中检查它。我在情节提要中创建了两个单元格,一个是简单的 UITableViewCell,另一个是 RDCell 类的自定义单元格。我不确定这是否提供了您想要的动画,但试一试,看看它是否接近:

#import "TableController.h"
#import "RDCell.h"

@interface TableController ()
@property (strong,nonatomic) NSArray *theData;
@property (nonatomic) NSIndexPath *selectedPath;
@end

@implementation TableController 


- (void)viewDidLoad {
    [super viewDidLoad];
    self.theData = @[@"One",@"Two",@"Three",@"Four",@"Five",@"Six",@"Seven",@"Eight"];
    self.selectedPath = [NSIndexPath indexPathForRow:-1 inSection:0];
    [self.tableView reloadData];
}


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


-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    if ([self.selectedPath isEqual:indexPath]) {
        return 90;
    }else{
        return 44;
    }

}

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

    if ([self.selectedPath isEqual:indexPath]) {
        RDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"RDCell" forIndexPath:indexPath];
        cell.label.text = self.theData[indexPath.row];
        return cell;

    }else{
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
        cell.textLabel.text = self.theData[indexPath.row];
        return cell;
    }
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSIndexPath *oldPath = self.selectedPath;
    self.selectedPath = indexPath;
    [self.tableView reloadRowsAtIndexPaths:@[indexPath,oldPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
于 2013-08-25T05:57:23.497 回答
2
 **Got this amazing Solution, its working great...**






 @implementation NetworkCentreTable
    {
        NSMutableArray *arr;
        BOOL chk;
        int onSelectCount;
        NSIndexPath *onSelectTrack;
    }
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        arr=[[NSMutableArray alloc] initWithObjects:@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",nil];
        onSelectCount=0;
        static NSString *CellIdentifier1 = @"NetworkCell2";
        UINib *nib = [UINib nibWithNibName:@"NetworkCentreCellBig" bundle:nil];
        [self.tblNetworkCentre registerNib:nib forCellReuseIdentifier:CellIdentifier1]; 
    }

    #pragma mark -
    #pragma mark Custom Network TableView delegate and Datasource

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

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


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


        static NSString *CellIdentifier1 = @"NetworkCentreCell";
        static NSString *CellIdentifier2 = @"NetworkCentreCellBig";


        if(self.selectedRowIndex && indexPath.row == self.selectedRowIndex.integerValue)

        {
            NetworkCentreCell *cell = (NetworkCentreCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
            UIViewController *controller=[[UIViewController alloc] initWithNibName:CellIdentifier2 bundle:nil];
            cell=(NetworkCentreCell *)controller.view;
            return cell;
        }
        else
        {
            NetworkCentreCell *cell = (NetworkCentreCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
            UIViewController *controller=[[UIViewController alloc] initWithNibName:CellIdentifier1 bundle:nil];
            cell=(NetworkCentreCell *)controller.view;
            return cell;

        }


    }

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        onSelectCount++;
        NSLog(@"num=%d",onSelectCount);
        self.selectedIndexPath = indexPath;
        [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation: UITableViewRowAnimationNone];
        self.selectedRowIndex = [NSNumber numberWithInteger:indexPath.row]; 
        [self.tblNetworkCentre deselectRowAtIndexPath:indexPath animated:YES];

        //First we check if a cell is already expanded.
        //If it is we want to minimize make sure it is reloaded to minimize it back
       if( onSelectCount==1 )
        {
             [tableView beginUpdates];
            NSIndexPath *previousPath = [NSIndexPath indexPathForRow:self.selectedRowIndex.integerValue inSection:0];
            self.selectedRowIndex = [NSNumber numberWithInteger:indexPath.row];
            onSelectTrack=indexPath;
            [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:previousPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView endUpdates];

        }
       if(onSelectTrack.row!=indexPath.row)
       {
           [tableView beginUpdates];
           [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:onSelectTrack] withRowAnimation:UITableViewRowAnimationFade];
            [tableView endUpdates];

           onSelectTrack=indexPath;
           onSelectCount=0;
           [self tableView:tableView didSelectRowAtIndexPath:onSelectTrack];

       }

        if(self.selectedRowIndex.integerValue == indexPath.row && onSelectCount==2)
            {
             [tableView beginUpdates];
            self.selectedRowIndex = [NSNumber numberWithInteger:-1];
            [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            onSelectCount=0;
            [tableView endUpdates];

        }


    }

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {


       if(self.selectedRowIndex && indexPath.row == self.selectedRowIndex.integerValue)

        {

            return 280;
        }else{
            return 85;
        }


    }
于 2013-08-27T06:51:23.870 回答
1

您可以在 didSelectRowAtIndexPath 方法中调用 [yourTableview reloadData]。然后在 numberOfRowsInSection 中给出一个新的计数。在 heightForRowAtIndexpath 中指定自定义高度。在 cellForRowAtIndexpath 添加自定义单元格。

于 2013-08-25T03:33:05.460 回答