我需要在选择时扩展/收缩单元格,这是我使用了很棒的教程here完成的。但是,我还需要在选择时显示/隐藏UILabel - 就像详细视图一样,当您展开单元格时,会显示更多标签;将其恢复到原始大小,并再次隐藏这些标签。
基本上:
点击
延长细胞长度
显示标签
再次点击
合同细胞
隐藏标签
一次只打开一个单元格
这听起来很简单,但是在网络上普遍使用的方法(我上面链接的教程)会在第一次触摸时自动取消选择其单元格,这意味着我隐藏的UILabel永远不会有机会出现。
如果我删除
[tableView deselectRowAtIndexPath:indexPath animated:TRUE];
来自didSelectRowAtIndexPath,我可以看到隐藏的标签,但它当然不会消失,因为在我选择不同的单元格之前,单元格不会被取消选择。
如果单元在第二次单击后返回到常规高度,单元格如何自动取消选择?此外,有没有办法将表限制为一次只有一个扩展单元格,因为现在,您可以完全展开所有单元格。如果扩展Cell2会自动将Cell1缩回原来的高度,我会喜欢它。
谢谢大家;如果没有Stack Overflow,我不知道自己会做些什么。
TableViewController.h
@interface TableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
IBOutlet UITableView *tableView;
NSMutableDictionary *selectedIndexes;
}
@end
TableViewController.m中的相关代码
@interface TableViewController (private)
- (BOOL)cellIsSelected:(NSIndexPath *)indexPath;
@end
@implementation TableViewController
#define kCellHeight 50.0
- (void)viewDidLoad {
[super viewDidLoad];
selectedIndexes = [[NSMutableDictionary alloc] init];
}
- (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];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
return cell;
}
#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...
[tableView beginUpdates];
[tableView 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
此外,来自UITableCell类的UILabel:
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
if (selected == YES){
date.hidden = NO;
}
else if (selected == NO) {
date.hidden = YES;
}
}
答案 0 :(得分:6)
我是个白痴。最简单的解决方案始终是最好的,这一行是一行代码:
self.contentView.clipsToBounds = YES;
当您设置细胞并将其布置时。
咄。
答案 1 :(得分:0)
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
if (selected == YES){
date.hidden = NO;
}
else if (selected == NO) {
date.hidden = YES;
}
无法正常工作,因为您取消选择了单元格,因此选中的BOOL始终为NO;) 所以,data.hidden = YES,永远......