2012-02-27 61 views
0
- (BOOL)cellIsSelected:(NSIndexPath *)indexPath 
{ 
    // Return whether the cell at the specified index path is selected or not 
    NSNumber *selectedIndex = [selectedIndexes objectForKey:indexPath]; 
    return selectedIndex == nil ? FALSE : [selectedIndex boolValue]; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Deselect cell 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    // Toggle 'selected' state 
    BOOL isSelected = ![self cellIsSelected:indexPath]; 
    // Store cell 'selected' state keyed on indexPath 
    NSNumber *selectedIndex = [NSNumber numberWithBool:isSelected]; 
    [selectedIndexes setObject:selectedIndex forKey:indexPath]; 
    // This is where magic happens... 
    [beveragesTableView beginUpdates]; 
    [beveragesTableView endUpdates]; 

    [selectedIndexes removeAllObjects]; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // If our cell is selected, return double height 
    if ([self cellIsSelected:indexPath] && ![[descriptionTypeArray objectAtIndex:indexPath.row] isEqualToString:@" "]) 
    { 
     return kCellHeight * 2.0; 
    } 
    // Cell isn't selected so return single height 
    return kCellHeight; 
} 

selectedIndexes被一個目的ofNSMutableDictonary其在h文件 聲明我已經建立在那裏動畫基於存在於所述細胞或不..描述,同時它動畫的tableview,如果我選擇一行的行大小增加,當我再次點擊它的行大小應該回到正常高度,我只能做到這一點,當我選擇另一行/單元格,我想細胞回去正常的高度,當我點擊選定的行。行不UITableView的細胞動畫得到取消

+0

一個問題:如果你希望用戶能夠在同一時間選擇一個以上的項目就不是完全清楚或只有一個?你實現了NSMutableArray - 導致更多的相信。但是,當用戶點擊一個時,您將清除所有選定的索引... – 2012-02-27 16:46:14

+0

用戶必須一次只選擇一個項目。在那裏的代碼允許用戶一次只選擇一個項目..它只是當用戶觸摸說第一個項目的單元格增加。但是當用戶觸摸相同的物品時,單元必須返回到其正常高度。我無法想象如何去做 – orgami 2012-02-27 17:22:40

+0

我認爲在selectedIndexes數組中有一些問題。你說當時只有一個(或沒有)細胞可以被選擇。然後insted數組只使用NSIndexPath * selectedIndex(如果沒有選中單元格,則可以爲nil)。代碼的可讀性會更高,並且更容易發現問題。 – 2012-02-27 17:41:12

回答

1

此代碼剛剛測試過,它的工作原理。你將不得不根據你的需要修改它,但基本的行爲應該適合你的需求。

請注意,不需要撥打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)[email protected]"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 
+0

感謝您的甜蜜代碼,我想在擴展單元的同時使用動畫,我如何實現這一點,感謝先進 – 2014-09-15 12:16:13

+0

嗨!我做了一個快速測試,似乎在'[tableView reloadData];'之前添加了'[tableView beginUpdates]; [tableView endUpdates];''添加了動畫效果。您可能想調用'reloadRowsAtIndexPaths:withRowAnimation:'而不是簡單的'reloadData',因爲它會產生更清晰的動畫。您必須將它傳遞給您想要實現的行數組(最終解決方案取決於所需的功能)。 – 2014-09-15 16:50:31