【问题标题】:How to animate just one UITableView cell/row based on something like description?如何根据描述之类的内容仅对一个 UITableView 单元格/行进行动画处理?
【发布时间】:2012-02-26 16:03:17
【问题描述】:

我有描述,单元格中的标题..有些标题有描述,有些没有。我想根据描述为行设置动画(增加大小),如果没有描述,则单元格不应该增加大小,就像有描述一样,单元格应该增加。标题和描述的数据是从 sql db 中获取的。我已经创建了动画部分,我在增加描述部分的单元格大小时遇到​​了麻烦.. - (void)tableViewUITableView *)tableView cellForRowIndexNSIndexPath *)indexPath 我已经定义从 descriptionArray 中获取值的 descriptionlabel

- (BOOL)cellIsSelected:(NSIndexPath *)indexPath;

@end

@implementation LOAnimatedCellDemoViewController

#define kCellHeight 50.0

- (void)viewDidLoad {
    [super viewDidLoad];

    selectedIndexes = [[NSMutableDictionary alloc] init];
}

- (void)viewDidUnload {
    [selectedIndexes release];
    selectedIndexes = nil;

    [super viewDidUnload];
}

- (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];
}



#pragma mark -
#pragma mark Tableview Datasource Methods

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 20;
}

#pragma mark -
#pragma mark Tableview Delegate Methods

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Deselect cell
    [tableView deselectRowAtIndexPath:indexPath animated:TRUE];

    // 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...
    [demoTableView beginUpdates];
    [demoTableView endUpdates];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    // If our cell is selected, return double height
    if([self cellIsSelected:indexPath]) {
        return kCellHeight * 2.0;
    }

    // Cell isn't selected so return single height
    return kCellHeight;
}

@end

【问题讨论】:

    标签: iphone objective-c xcode ipad ios5


    【解决方案1】:

    尝试用这个替换你的didSelectRowAtIndexPath

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        // Deselect cell
        [tableView deselectRowAtIndexPath:indexPath animated:TRUE];
    
        // 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...
        [demoTableView beginUpdates];
    
        //these two lines were added
        NSArray *array = [NSArray arrayWithObject:indexPath]; 
        [self.tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationNone];   
    
        [demoTableView endUpdates];
    }
    

    并确保在过程中调用 cellForRowAtIndexPath: 时返回正确的(大/小)视图。

    【讨论】:

    • NSArray *array = [NSArray arrayWithObject:indexPath]; [self.tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationNone];根据上面的代码,单元格/行如何知道单元格中是否存在描述?单元格不应该增加高度(应该是正常的)如果单元格中没有描述,它应该只在有描述时增加高度
    • 您的 cellForRowAtIndexPath 和 heightForRowAtIndexPath 将被调用,您可以在此处处理此问题。有关描述是否存在于某个单元格中的信息应存储在外部 - 在数据模型中 -
    • 我能够解决这个问题,但我想出了另一个问题stackoverflow.com/questions/9466797/…
    • @orgami:我去看看。并请在此处发布您对此问题的解决方案,以便其他人从中受益(将来会提出类似问题的人)
    • if([self cellIsSelected:indexPath] && ![descriptionArray objectAtIndex:indexpath.row] isEqualToString:@" "]) 这就是我解决问题的方法..我给了 isEqualToString:@ “”导致数据库中没有描述的项目我给了它一个空格字符,这样它就表明该项目没有可用的描述
    【解决方案2】:

    在 if([self cellIsSelected:indexPath]) 行中我添加了

    if([self cellIsSelected:indexPath] && ![descriptionArray objectAtIndex:indexpath.row] isEqualToString:@" "]) 我在数据库列中给了 isEqualToString:@" " 原因,因为我给了没有描述的项目 单个空格字符因此它表明该项目没有可用的描述 -

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-25
      • 2016-04-20
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      相关资源
      最近更新 更多