UITableView метод reloadData создает проблему размытых данных - PullRequest
2 голосов
/ 15 декабря 2011

У меня есть UITableView, в котором каждый UITableViewCell имеет UIView на них и выше UIView, у меня есть два UIButton и два UILabel.Моя проблема заключается в том, что когда я перезагружаю табличное представление, то новые данные перезаписываются на старые данные, что делает содержимое размытым и нечетким, и в методе cellForRowAtIndexPath я использовал этот код удаления метки, тогда он также не работает должным образом .......

NSArray *subviews = [[NSArray alloc] initWithArray:cell.contentView.subviews];
    for (UILabel *subview in subviews) {
        [subview removeFromSuperview];
    }
    [subviews release];

Этот код показывает строку за раз, иначе никто ...

Код cellForRowAtIndexPath такой ...

- (UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath {   
    static NSString *identifier = @"Cell";
    UITableViewCell *cell = [tableView1 dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
    }

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    NSDictionary *dict = [appDelegate.webDataList objectAtIndex:indexPath.row];

    tableView.backgroundColor = [UIColor colorWithRed:0.39 green:0.39 blue:0.39 alpha:0.39];

    if([appDelegate.dataArray count]>0){

        imgView.backgroundColor = [UIColor clearColor];
        imgView =[[UIView alloc ] initWithFrame:CGRectMake(0,0,320,45)];
        imgView.tag= indexPath.row+250;
        [cell.contentView addSubview:imgView];

        button=[UIButton buttonWithType:UIButtonTypeCustom];
        button.frame=CGRectMake(291, 5, 19, 21);
        img =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"swap_re" ofType:@"png"]];
        [button setBackgroundImage:img forState:UIControlStateNormal];
        [button addTarget:self action:@selector(swapButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
        button.tag= indexPath.row+250;
        [imgView addSubview:button];

        button=[UIButton buttonWithType:UIButtonTypeCustom];
        button.frame=CGRectMake(-25, 5, 19, 21);
        img =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"swap_re" ofType:@"png"]];
        [button setBackgroundImage:img forState:UIControlStateNormal];
        [button addTarget:self action:@selector(swapButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
        button.tag= indexPath.row+250;
        [imgView addSubview:button];

        button=[UIButton buttonWithType:UIButtonTypeCustom];
        button.frame=CGRectMake(5, 7, 19, 21);
        button.tag = indexPath.row+250;
        img =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"delete" ofType:@"png"]];
        [button setBackgroundImage:img forState:UIControlStateNormal];
        [button addTarget:self action:@selector(deleteButtonPressed:) forControlEvents:UIControlEventTouchUpInside];    
        [imgView addSubview:button];

        NSArray *arr = [[appDelegate.dataArray objectAtIndex:indexPath.row] componentsSeparatedByString:@"/"];


        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(34,9,140,20)];
        label.text = [arr objectAtIndex:1];
        label.tag = indexPath.row+250;
        [label setFont:[UIFont fontWithName:@"Georgia" size:14]];
        [label setNumberOfLines:0];
        label.textAlignment = UITextAlignmentLeft;
        label.textColor = [UIColor whiteColor];
        label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        label.backgroundColor = [UIColor clearColor];
        [imgView addSubview:label];
        [label release];

        NSDictionary *dict1 =[appDelegate.webDataList objectAtIndex:indexPath.row];


        label = [[UILabel alloc] initWithFrame:CGRectMake(181, 7, 75, 20)];
        label.tag = indexPath.row+250;
        label.text = [dict1 objectForKey:@"time"];
        [label setFont:[UIFont fontWithName:@"Georgia" size:16.0]];
        label.textAlignment = UITextAlignmentLeft;
        [label setBackgroundColor:[UIColor clearColor]];
        label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        [label setTextColor:[UIColor whiteColor]];
        [imgView addSubview:label];
        [label release];
    }
    return cell;
}

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

1 Ответ

3 голосов
/ 15 декабря 2011

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

Добавьте элемент пользовательского интерфейса при создании новой ячейки и присвойте им тег.Если ячейка была успешно удалена, возьмите элемент по этому тегу и установите его значения.

Примерно так:

if (cell == nil) {
    // if no cell could be dequeued create a new one
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];

    // add label to the new cell
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(34,9,140,20)];
    label.tag = 250;  // <---- save tag
    [label setFont:[UIFont fontWithName:@"Georgia" size:14]];
    [label setNumberOfLines:0];
    label.textAlignment = UITextAlignmentLeft;
    label.textColor = [UIColor whiteColor];
    label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
    label.backgroundColor = [UIColor clearColor];
    //[imgView addSubview:label]; // I ignore this because I don't want to write 200 lines of code here. This is just an example so please adopt the code yourself
    [cell.contentView addSubView:label];
    [label release];
}

// whatever happened you have a cell with all the labels added here

UILabel *label = (UILabel *)[cell.contentView viewWithTag:250]      // <---- get label with tag
label.text = [arr objectAtIndex:1];

и вам не нужно if([appDelegate.dataArray count]>0).Если все остальные методы источника данных табличного представления верны, tableView:cellForRowAtIndexPath: не вызывается, если ваш источник данных пуст.


Редактировать: Только что видел этот:

мой код, я не могу использовать метод reuseTableViewCellWithIdentifier: потому что я хочу, чтобы каждый ярлык и тег кнопки были одинаковыми, потому что мне нужно их извлекать где-то еще.Каждый может и должен использовать reuseTableViewCellWithIdentifier:.
Какие у вас проблемы с этим?
Если вам нужно получить indexPath (или в вашем случае только строку) в методе действия кнопки, используйте код из моего ответ на другой вопрос

...