- У меня есть UITableView в UIView
- Ячейки табличного представления являются пользовательскими и, следовательно, управляются классом UITableViewCell
Мне нужно расширять / сжимать ячейки привыбор, который я сделал, используя удивительный урок здесь .Тем не менее, мне также нужно показывать / скрывать метки UILabels при выделении - как в подробном представлении, когда вы расширяете ячейку, отображается больше меток;сверните его обратно в исходный размер, и эти ярлыки снова будут скрыты.
В основном:
Нажмите
Увеличить длину ячейки
Показать метки
Нажмите еще раз
Ячейка контракта
Скрыть метки
Только 1ячейка открыта за один раз
Все это звучит достаточно просто, но метод, широко используемый в Интернете (учебник, на который я ссылался выше), автоматически отменяет выбор его ячеек при первом касании, что означает, что мои скрытые метки UILabels никогда не получатшанс появиться
Если я удаляю
[tableView deselectRowAtIndexPath:indexPath animated:TRUE];
из didSelectRowAtIndexPath, я могу получить скрытую метку, но она, конечно, не исчезает, так как ячейка не отменяется, пока я не выберу другуюячейка.
Как я могу сделать так, чтобы ячейка автоматически отменяла выбор, когда она возвращается к своей обычной высоте после того, как пользователь щелкает ее во второй раз?Кроме того, есть ли возможность ограничить таблицу только одной расширенной ячейкой за раз, потому что прямо сейчас вы можете полностью развернуть все ячейки.Я бы хотел, чтобы расширение Cell2 автоматически уменьшило значение Cell1 до его первоначальной высоты.
Спасибо всем;иногда не знаю, что бы я делал без переполнения стека.
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
Также,UILabels из класса UITableCell:
- (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;
}
}