iPhone TableViewCell - добавление и удаление кнопки с условием - PullRequest
0 голосов
/ 17 июня 2011

Как правильно добавить / удалить кнопку на правой стороне ячейки?

Как добавить условие проверки каталога в каждую ячейку, а затем отобразить один из двух типов ячеек?

В моем случае: ViewWillAppear загружает XML с именами каталогов и загружает его в TableView. Каждая ячейка проверяет, существует ли каталог на телефоне. Если это так, то ячейка без кнопки (выкл.), Если нет, ячейка получает кнопку (вкл.). Также ImageViews разные.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [uitableview dequeueReusableCellWithIdentifier:CellIdentifier];

    SomeClass *k = (SomeClass*)[self.arr_SomeClass objectAtIndex:indexPath.row];
    NSString *checkThisDir = [documents_dir stringByAppendingPathComponent:[k.dir_name stringByDeletingPathExtension]];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

        cell.imageView.tag = 121;
        cell.imageView.contentMode = UIViewContentModeScaleAspectFit;

        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    if (![[NSFileManager defaultManager] fileExistsAtPath:dir_name isDirectory:nil]) {

        cell.imageView.image = [UIImage imageNamed:@"icon_on.png"];

        UIButton *bt = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        bt.contentMode = UIViewContentModeScaleAspectFit;
        bt.tag = 123;
        UIImage *imgDownload = [UIImage imageNamed:@"icon_button.png"];
        [bt setImage:imgDownload forState:UIControlStateNormal];
        [bt setImage:imgDownload forState:UIControlStateHighlighted];
        [bt setImageEdgeInsets:UIEdgeInsetsMake(4,3,2,3)];
        [bt setFrame:CGRectMake(282,5,34,34)];
        [bt addTarget:self action:@selector(listButtonClick:event:) forControlEvents:UIControlEventTouchUpInside];
        [cell addSubview:bt];

        UIView *empty = [UIView new]; // makes space for button
        cell.accessoryView = empty;
        [empty release];
    }
    else {      

        // or: cell.imageView.image = [UIImage imageNamed:@"icon_off.png"];
        UIButton *bt = (UIButton*)[cell viewWithTag:123];
        [bt removeFromSuperview];

        UIImageView *iv = (UIImageView*)[cell viewWithTag:121];
        iv.image = [UIImage imageNamed:@"icon_off.png"];
    }
    cell.detailTextLabel.text = k.details;
    cell.textLabel.text = k.name;

    return cell;    
}

listButtonClicked просто загружает файл и создает каталог, а затем выполняет reloadData и reloadRowsAtIndexPaths в TableView.

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

Любая помощь была бы хороша, заранее спасибо!

.

РЕШИТЬ:

Перенесено создание кнопки в if (cell==nil) { .. } и добавлено извне:

UIButton *bt = (UIButton*)[cell viewWithTag:123];
if (![[NSFileManager defaultManager] fileExistsAtPath:albumDir isDirectory:nil]) {
    cell.imageView.image = [UIImage imageNamed:@"icon_on.png"];
    [bt setHidden:NO];
}
else {
    cell.imageView.image = [UIImage imageNamed:@"icon_off.png"];
    [bt setHidden:YES];
}

1 Ответ

2 голосов
/ 17 июня 2011

Это происходит потому, что вы удаляете ячейки из таблицы (это хорошо!), Поэтому iOS не воссоздает их каждый раз, когда вам нужна новая ячейка.Как только ячейка будет удалена, она принесет внутрь все подпредставления, которые вы добавили в нее ранее (например, для другой строки).Для того, чтобы все это работало правильно, после того как вы удалили ячейку из очереди, вы должны очистить все ее содержимое, а затем отобразить его, как хотите.

В противном случае лучшим подходом может быть создание ячейки в * 1003.* блок, автоматически добавляет вид для изображения и кнопки, без установленного изображения.Пройдя этот блок, вы получите изображение с помощью тега ([cell viewWithTag:121]), а также кнопки ([cell viewWithTag:123]) и установите их как скрытые.Отныне вы можете начать определять ячейку по мере необходимости.

Таким образом, каждый раз, когда вы запрашиваете ячейку, у нее будет изображение по умолчанию и кнопка внутри, но скрытые, и позже вы установите их как видимые в зависимости отваши потребности.

Это должно решить вашу проблему.Дайте мне знать, если это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...