ios - 无法在didSelectRowAtIndexPath中调用cellForRowAtIndexPath而不影响动画?

标签 ios objective-c uitableview

我已经检查了所有重复的问题。但是我没有找到解决方案。如果我的问题不正确,请纠正我。

我有带有label(用于标题)和textview(用于描述)的自定义单元格。我正在尝试可扩展单元。首先,它将仅显示标题,当我点击时,它将显示描述。因此,在开始时textview(Description)将被隐藏(我将在cellForRowAtIndexPath中指定),只要用户触摸在didSelectRowAtIndexPath函数中检测到的单元格,我都将使其可见,并且我还将更改高度。

我知道我可以使用[tableView reload]函数调用cellForRowAtIndexPath。但是我正在使用

[tableView beginUpdates];
[tableView endUpdates];

高度变化时,在didSelectRowAtIndexPath的内部进行动画处理。在这里,如果我使用[tableView reload],则动画无法正常工作。数据显示完美,但没有动画。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView beginUpdates];
    if ([indexPath compare:self.expandedIndexPath] == NSOrderedSame) {
        self.expandedIndexPath = nil;
    } else {
        self.expandedIndexPath = indexPath;
    }
  [tableView endUpdates];
}

我希望在cellForRowAtIndexPath内部调用didSelectRowAtIndexPath函数而不影响动画。

感谢您的时间(:

我的代码:
#import "MyListViewController.h"
#import "CustomCell.h"

@interface MyListViewController ()
@property NSArray* tableData;
@property (strong, nonatomic) NSIndexPath *expandedIndexPath;
@end

@implementation MyListViewController

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"SimpleTableItem";

    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    cell.secondary.text = @"adfasdfasdfsdfsdffassssssddalfdsaldjsfadsfasdfdjsfldsjfakldsfjlasfaksfjadksfaldfjladksfjadksfjdkslsdjjlkflasfaljfajfalkflkadslsdfljksdfajsdasdfjlkafsjlkasdjfafsdjadfjksadjsladfjsajladfjslas";
    if ([indexPath compare:self.expandedIndexPath] == NSOrderedSame) {
        cell.primaryLabel.text = [self.tableData objectAtIndex:indexPath.row];
        cell.secondary.hidden = NO;

    }else{
        cell.primaryLabel.text = [self.tableData objectAtIndex:indexPath.row];
        cell.secondary.hidden = YES;
    }
       // cell.textLabel.text = [self.tableData objectAtIndex:indexPath.row];
   // cell.imageView.image = [UIImage imageNamed:@"creme_brelee.jpg"];
    return cell;
}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    //[tableView reloadData];
    if ([indexPath compare:self.expandedIndexPath] == NSOrderedSame) {

        return 100.0; // Expanded height

    }
    return 30.0; // Normal height
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView beginUpdates];
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    if ([indexPath compare:self.expandedIndexPath] == NSOrderedSame) {
        self.expandedIndexPath = nil;
    } else {
        self.expandedIndexPath = indexPath;
    }
  [tableView endUpdates];
}



- (void)viewDidLoad {
    [super viewDidLoad];

    self.tableView.delegate=self;
    self.tableView.dataSource=self;

    self.tableData = [NSArray arrayWithObjects:@"Egg Benedict", @"Mushroom Risotto", @"Full Breakfast", @"Hamburger", @"Ham and Egg Sandwich", @"Creme Brelee", @"White Chocolate Donut", @"Starbucks Coffee", @"Vegetable Curry", @"Instant Noodle with Egg", @"Noodle with BBQ Pork", @"Japanese Noodle with Pork", @"Green Tea", @"Thai Shrimp Cake", @"Angry Birds Cake", @"Ham and Cheese Panini", nil];


    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
#warning Incomplete implementation, return the number of sections
    return 1;
 }




@end

最佳答案

[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:@[indexpath] withRowAnimation:UITableViewRowAnimationAutomatic];//indexpath of your selected row
[tableView endUpdates]; 

关于ios - 无法在didSelectRowAtIndexPath中调用cellForRowAtIndexPath而不影响动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38116461/

相关文章:

ios - 如何通过 AFNetworking 列出 ftp 的目录内容

iphone - 如何在iPhone中更改UITextView最后输入的文本颜色?

iphone - 如何使用执行选择器选择随机方法?

ios - 使用 sectionForSectionIndexTitle 在 UITableView 中快速滚动

iphone - 处理 UITableViewCell 中的按钮

ios - 自定义转场不起作用

iphone - 在 viewDidLoad 中触发旋转

ios - SWRevealViewController - RightViewController

ios - 我需要制作一个可以被多个 View Controller 访问的数组实例

ios - 如何从字符串数组中创建 uitableview 索引和部分