iPhone - Расширьте UITableView с помощью пользовательской ячейки и скрывайте / отображайте метки при выборе - PullRequest
3 голосов
/ 24 июня 2011
  • У меня есть 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;
    }
}

Ответы [ 2 ]

6 голосов
/ 25 июня 2011

А я идиот.Самое простое решение всегда самое лучшее, и это одна строка кода:

 self.contentView.clipsToBounds = YES;

, когда вы настраиваете свою ячейку и выкладываете ее.

Дух.

0 голосов
/ 07 июля 2011
- (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 всегда НЕТ;) Итак, data.hidden = YES, навсегда ...

...