Можно ли как-то индексировать кнопку в строке табличного представления? - PullRequest
0 голосов
/ 15 января 2012

У меня есть табличное представление с 3 предметами, один из которых у меня за кнопкой. Когда кнопка выбрана, я хочу скрыть эту кнопку, открывая элемент позади нее. Я отображаю строку таблицы, используя ячейку представления таблицы. Когда я выбираю одну кнопку, чтобы скрыть, при прокрутке таблицы скрываются другие кнопки. Скрытие кнопки, кажется, скрывает кнопку, основываясь на каком-то месте в видимых строках текущего представления. Я пытаюсь скрыть кнопку в определенной строке.

Я могу писать в NSLog всякий раз, когда нажимаю на код, чтобы скрыть кнопку, и попаду туда только один раз, но при прокрутке таблицы скрытый атрибут для кнопки применяется к другим строкам, которые появляются. Если я выберу кнопку в строке 53, я хочу скрыть только кнопку в строке 53, а не кнопки в других строках таблицы из 120 строк.

Кто-нибудь когда-нибудь делал то, что я пытаюсь сделать? Буду признателен за любую помощь, чтобы выяснить, что происходит. Спасибо.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *ElementCellIdentifier = @"ElementCellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ElementCellIdentifier];
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ElementRowCell"
                                                 owner:self options:nil];
        if ([nib count] > 0) {
            cell = self.tvCell;
        } else {
            NSLog(@"failed to load ElementRowCell nib file!");
        }
    }

    NSUInteger row = [indexPath row];

    UILabel *atomic_number = (UILabel *)[cell.contentView viewWithTag:1];                               
    atomic_number.text = [NSString stringWithFormat:@"%d",elements_table[row].atomic_number];

    UILabel *element_name = (UILabel *)[cell.contentView viewWithTag:2];
    element_name.text = [NSString stringWithCString:elements_table[row].element_name];

    UILabel *element_symbol = (UILabel *)[cell.contentView viewWithTag:3];
    element_symbol.text = [NSString stringWithCString:elements_table[row].element_symbol];

    return cell;
}

- (IBAction)buttonPressed:(id)sender {

NSLog(@"Getting to buttonPressed from row button");
UIButton *pressedButton = (UIButton *)sender;
NSIndexPath *indexPath = [self.mainTableView indexPathForCell:     (UITableViewCell *)[sender superview]];
pressedButton.hidden = TRUE;

}

1 Ответ

0 голосов
/ 15 января 2012

Извините. По сути дела, вы скрываете экземпляр кнопки в этой конкретной ячейке табличного представления. Проблема в том, что когда он получает dequeue'd для другой строки, ничто не восстанавливает его состояние. И если бы вы просто восстановили его состояние в видимом, то строки, по которым вы щелкнули, были бы забыты. Вам нужно будет сохранить строки, по которым уже щелкнули, чтобы правильно восстановить состояние в tableView:cellForRowAtIndexPath:.

Как бы я справился с этим - объявить NSMutableSet *selectedIndexPaths;. И используйте это, чтобы сохранить строки, которые я выбрал. Затем при нажатии кнопки добавьте этот indexPath к набору следующим образом.

- (IBAction)buttonPressed:(UIButton *)button{
    if (![button isKindOfClass:[UIButton class]]) return;
    UIView *finder = button.superview;
    while ((![finder isKindOfClass:[UITableViewCell class]]) && finder != nil) {
        finder = finder.superview;
    }
    if (finder == nil) return;
    UITableViewCell *myCell = (UITableViewCell *)finder;
    NSIndexPath *indexPath = [self.mainTableView indexPathForCell:myCell];
    [selectedIndexPaths addObject:indexPath];
    button.hidden = TRUE;
    NSLog(@"IndexPathRow %d",indexPath.row);
}

Теперь для правильного восстановления состояния при прокрутке в tableView:cellForRowAtIndexPath: используйте оператор if, чтобы установить скрытое свойство кнопки, например:

buttonPropertyName.hidden = ([selectedIndexPaths containsObject:indexPath]);
...