행은

2012-02-27 7 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 난은 애니메이션 동안 상기 셀에 존재하는 여부 .. 설명 기초 애니메이션화의 tableview를 .H 파일 에서 선언되는 객체 ofNSMutableDictonary 작성한된다 jQuery과 셀 애니메이션 해제하기되지 내가 행을 선택하면 행 크기가 커지고 행 크기가 정상 높이로 돌아 가야합니다. 다른 행/셀을 선택할 때만 할 수 있습니다. 셀로 돌아가고 싶습니다. 선택한 행을 탭하면 정상 높이가됩니다.행은

+0

질문 하나 : 당신은 사용자가 한 번에 두 개 이상의 항목을 선택 할 수 있도록하려면 그것은 전적으로 분명 아니면 하나만? 당신은 NSMutableArray를 구현했다. 그러나 사용자가 하나를 탭하면 선택한 모든 색인이 지워집니다. –

+0

사용자는 한 번에 하나의 항목 만 선택해야합니다. 거기에있는 코드는 사용자가 한 번에 하나의 항목 만 선택할 수있게 해줍니다. 사용자가 건 드리면 첫 번째 항목이 셀을 증가 시킨다는 것입니다. 사용자가 동일한 항목을 터치하면 셀은 정상 높이로 돌아갑니다. 나는 그것을 할 방법을 그림 수 없습니다 오전 – orgami

+0

내가 selectedIndexes 배열에 몇 가지 문제가 있다고 생각합니다. 그 중 한 셀 만 선택할 수 있다고 말합니다. 그런 다음 배열의 insted는 NSIndexPath * selectedIndex를 사용합니다 (셀이 선택되지 않으면 nil이 될 수 있음). 코드는 그렇게 쉽게 읽고 문제를 쉽게 찾을 수 있습니다. –

답변

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

달콤한 코드를 보내 주셔서 감사합니다. 셀을 확장하면서 애니메이션을 사용하고 싶습니다. 어떻게하면 좋을까요? 고맙습니다. –

+0

안녕하세요. 빠른 테스트를했고'[tableView beginUpdates]; [tableView endUpdates];'[tableView reloadData];가 나오기 전에 애니메이션 효과를 추가합니다. 훨씬 더 깨끗한 애니메이션을 생성하기 때문에 간단한 reloadData 대신에'reloadRowsAtIndexPaths : withRowAnimation :'을 호출하는 것이 좋습니다. 다시로드 할 행 배열을 전달해야합니다 (최종 솔루션은 원하는 기능에 따라 다름). –