Этот код был только что протестирован, и он работает.Вам придется изменить его для своих нужд, но основное поведение должно соответствовать вашим потребностям.
Обратите внимание, что нет необходимости вызывать beginUpdates/endUpdates
.
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) IBOutlet UITableView *tableView;
@property (nonatomic, strong) NSIndexPath *lastSelectedCell;;
@end
ViewController.m
#import "ViewController.h"
@implementation ViewController
@synthesize tableView = _tableView;
@synthesize lastSelectedCell = _lastSelectedCell;;
#pragma mark - UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 100;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyIdentifier"];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.textLabel.text = [NSString stringWithFormat:@"row %d %@",indexPath.row, ([indexPath compare:_lastSelectedCell] == NSOrderedSame)?@"S":@"-"];
return cell;
}
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"S: %d", indexPath.row);
if (([indexPath compare:_lastSelectedCell] == NSOrderedSame)) {
_lastSelectedCell = nil;
} else {
[self setLastSelectedCell: indexPath];
}
[tableView reloadData];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return ([indexPath compare:_lastSelectedCell] == NSOrderedSame)?80.0:40.0;
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
_tableView.dataSource = self;
_tableView.delegate = self;
}
- (void)viewDidUnload
{
[super viewDidUnload];
_tableView = nil;
_lastSelectedCell = nil;
}
@end