Очистите ячейки в UITableView, чтобы поместить другие представления в ячейки - PullRequest
0 голосов
/ 14 января 2012

Я собираюсь иметь ячейки с разными подпредставлениями в зависимости от выбранной категории. Я выбираю новую категорию, перезагружаю данные и т. Д., Но вместо того, чтобы отображать новую ячейку с другими подпредставлениями, при переключении между категориями эти представления накладываются друг на друга, как это исправить? Вот мой код:

//cell for row at indexPath    
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier];
    }

    if ([currentCategory isEqualToString:@"Projects"])
    {
        Project *pr=[projectsArray objectAtIndex:indexPath.row];
        NSLog(@"Project ID %i, ProjectName %@", pr.ident, pr.projectName);

        UILabel *nameLabel=[[UILabel alloc] initWithFrame:CGRectMake(0, 20, 200, 100)];
        nameLabel.text=pr.projectName;

        UIImageView *iv=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 192)];
        iv.image=pr.baseImage;
        [cell addSubview:iv];
        [cell addSubview:nameLabel];
    }
    else if ([currentCategory isEqualToString:@"Glossaire"])
    {            
        Glossaire *gl=[glossaireArray objectAtIndex:indexPath.row];
        UILabel *nameLabel=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 45)];
        nameLabel.font=[UIFont fontWithName:@"Arial" size:25.0f];
        nameLabel.text=gl.glossaireName;
        nameLabel.backgroundColor=[UIColor redColor];
        UILabel *introLabel=[[UILabel alloc] initWithFrame:CGRectMake(0, 50, 200, 50)];
        introLabel.font=[UIFont fontWithName:@"Arial" size:16.0f];
        introLabel.text=gl.intro;
        introLabel.backgroundColor=[UIColor redColor];
        UILabel *descriptionLabel=[[UILabel alloc] initWithFrame:CGRectMake(0, 100, 350, 100)];
        descriptionLabel.font=[UIFont fontWithName:@"Arial" size:16.0f];
        descriptionLabel.text=gl.description;
        descriptionLabel.backgroundColor=[UIColor redColor];
        NSLog(@"Glossaire ID: %i, NAME: %@ INTRO: %@ Description %@", gl.ident, gl.glossaireName, gl.intro, gl.description);
        [cell addSubview:nameLabel];
        [cell addSubview:introLabel];
        [cell addSubview:descriptionLabel];            
    }

    return cell;
}
//And switching between categories
- (IBAction)viewProjects:(id)sender 
{
    currentCategory=@"Projects";
    projectsArray=[dbm fetchProjectsSummary];
    [mainTable reloadData];            
}

- (IBAction)viewGlossaire:(id)sender
{
    currentCategory=@"Glossaire";
    glossaireArray=[dbm fetchGlossaireSummary];
    [mainTable reloadData];
}

Также они говорят, что идентификатор повторного использования устарел, какая у него новая версия? спасибо!

1 Ответ

3 голосов
/ 14 января 2012

Я только что ответил на аналогичный вопрос в cellForRowAtIndexPath management memory .

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier];
}

Ипросто имейте это:

   UITableViewCell *cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:nil];

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

Чтобы на самом деле ответить на ваш вопрос, вы могли бы просто пройтись по подпредставлениям клетки и сказать [view removeFromSuperview], чтобы вычистить их каждый раз, но я не думаю, что это хорошее решение.

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