2010-01-05 6 views
1

J'ai une UITableView dans une application iPhone que je rafraîchis (en appelant [self.tableView reloadData] dans la méthode d'action pour un UISegmentedControl intégré dynamiquement dans l'une des cellules UITableView. pour mettre à jour une valeur de texte pour l'une des cellulesUITableView rechargement de données/actualisation (problème de duplication possible)

Cependant, le code suivant semble produire un effet secondaire indésirable: chaque fois que l'UITableView se rafraîchit, il crée une nouvelle instance de UISegmentedControl (et éventuellement les images). - Je ne suis pas sûr (e)) par rapport au (x) existant (s)

La seule raison pour laquelle je remarque ceci est que chaque rafraîchissement est une mise à nu La frontière perceptible commence à se former autour du UISegmentedControl et l'application ralentit sensiblement. Je serais extrêmement reconnaissant pour toute suggestion/code-solutions à ma situation actuelle.

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 


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

    NSUInteger section = indexPath.section; 
    NSUInteger row = indexPath.row; 

    // Set up the cell...  


    //populates the personal info section 
    if (section == kPersonalInfoAddSection) { 

     if (row == kNameRow) { 

        //Other code irrelevant to this question was removed for the sake of clarity 
     } 
     else if(row == kHeightRow) { 

      cell.imageView.image = [UIImage imageNamed:@"tableview_height_label.png"]; 
        //THIS IS THE TEXT I'M TRYING TO UPDATE 
      cell.textLabel.text = [Formatter formatHeightValue:mainUser.heightInMM forZone:self.heightZone]; 
      cell.detailTextLabel.text = REQUIRED_STRING; 

     } 
    } 

    //populates the units section 
    if (section == kUnitsSection) { 

     if (row == kHeightUnitsRow) { 
      NSArray *heightUnitsSegments = [[NSArray alloc] initWithObjects:FT_AND_IN_STRING, M_AND_CM_STRING, nil]; 

      UISegmentedControl *heightUnitControl = [[UISegmentedControl alloc] initWithItems:heightUnitsSegments]; 

      CGRect segmentRect = CGRectMake(90, 7, 200, 30); 
      [heightUnitControl setFrame:segmentRect]; 
      //[heightUnitControl setSelectedSegmentIndex:0]; 
      [heightUnitControl addTarget:self action:@selector(heightSegmentClicked:) forControlEvents:UIControlEventValueChanged]; 
      heightUnitControl.tag = kHeightSegmentedControlTag; 

      cell.textLabel.text = @"Height:"; 
      cell.detailTextLabel.text = @"(units)"; 
      [cell.contentView addSubview:heightUnitControl]; 

      [heightUnitsSegments release]; 
      [heightUnitControl release]; 

     } 
     else if(row == kWeightUnitsRow) { 

        //Other code irrelevant to this question was removed for the sake of clarity  

     } 
    } 

    return cell; 
} 

Merci à tous à l'avance!

Répondre

2

Vous avez raison, il crée une nouvelle instance de UISegmentedControl. C'est parce que vous utilisez un identifiant de cellule générique, @ "Cell", puis en ajoutant le UISegmentedControl à chaque fois, jamais en le supprimant. Les cellules sont mises en cache contenant UISegmentedControl, vous récupérez la cellule mise en cache et ajoutez à nouveau le contrôle.

Vous pouvez utiliser un identifiant de cellule plus spécifique et si cell! = Nil vous savez qu'il contient déjà UISegmentedControl. Ou créez une nouvelle cellule chaque fois que vous n'utilisez pas une cellule mise en cache qui contient déjà le contrôle. Avec l'affichage de l'image, il vous suffit de définir la propriété d'affichage de l'image des cellules sans ajouter une nouvelle vue à la cellule afin que celle-ci soit correcte, elle est remplacée à chaque fois. Puisque le texte que vous essayez de mettre à jour n'a rien à voir avec le UISegmentedControl, je pense que vous devriez pouvoir utiliser un identifiant de cellule plus spécifique et ajouter le contrôle uniquement à la création de cellule.

+0

Encore mieux, créez une sous-classe UITableViewCell personnalisée et utilisez-la. Il n'y a aucune raison de vous limiter aux types de cellules par défaut si vous avez des besoins plus complexes. – TechZen

+0

Merci pour les réponses. Je me demandais juste comment UITableViewCells personnalisé aiderait dans cette circonstance particulière (je suis relativement nouveau pour le développement de l'iPhone). En outre, il semble que l'utilisation de cellules personnalisées signifie que l'apparence arrondie des cellules dans une vue groupée disparaît (remplacée par des conrners carrés). – Urizen

0
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSArray *arr1=[NSArray arrayWithObjects:@"img1.jpg",@"img2.jpg",nil]; 
    NSArray *arr2=[NSArray arrayWithObjects:@"img1.jpg",@"img2.jpg",@"img3.jpg",@"img4.jpg",@"img5.jpg",@"img6.jpg",nil]; 
    NSArray *arr3=[NSArray arrayWithObjects:@"img6.jpg",@"img5.jpg",@"img2.jpg",@"img1.jpg",nil]; 

    Imgs = [[NSArray alloc] initWithArray:[NSArray arrayWithObjects:arr1,arr2,arr3,nil]]; 


    NSDictionary *dic1=[NSDictionary dictionaryWithObjectsAndKeys:@"Ahmedabad",@"Name",@"Picture 5.png",@"Rating",@"Picture 1.png",@"Photo",arr1,@"img",nil]; 
    NSDictionary *dic2=[NSDictionary dictionaryWithObjectsAndKeys:@"Rajkot",@"Name",@"Picture 5.png",@"Rating",@"Picture 2.png",@"Photo",nil]; 
    NSDictionary *dic3=[NSDictionary dictionaryWithObjectsAndKeys:@"Baroda",@"Name",@"Picture 5.png",@"Rating",@"Picture 7.png",@"Photo",nil]; 

    tblArray=[[NSArray alloc] initWithObjects:dic1,dic2,dic3,nil]; 
    [myTbl reloadData]; 

} 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    self.navigationController.navigationBarHidden=NO; 
    [self.navigationController.navigationBar setUserInteractionEnabled:YES]; 

} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    self.navigationController.navigationBarHidden=YES; 
} 



-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 
    return 1; 
} 
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return [tblArray count]; 
} 
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    NSString *CellIdentifer=[NSString stringWithFormat:@"%i",indexPath.row]; 
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifer]; 
    if(cell==nil){ 
     cell=[self myCustomCell:CellIdentifer dicToSet:[tblArray objectAtIndex:indexPath.row]]; 
     [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; 
    } 
    return cell; 
} 

-(UITableViewCell*)myCustomCell:(NSString*)CellIdentifer dicToSet:(NSDictionary*)dicToSet{ 
    UITableViewCell *cell=[[[UITableViewCell alloc] initWithFrame:CGRectMake(0, 0, 320, 44) reuseIdentifier:CellIdentifer] autorelease]; 

    UIImageView *imgV=[[UIImageView alloc] initWithFrame:CGRectMake(2, 2, 40, 40)]; 
    [imgV setImage:[UIImage imageNamed:[dicToSet valueForKey:@"Photo"]]]; 
    [cell addSubview:imgV]; 
    [imgV release]; 

    UILabel *lbl=[[UILabel alloc] initWithFrame:CGRectMake(44, 2, 276, 20)]; 
    [lbl setText:[dicToSet valueForKey:@"Name"]]; 
    [cell addSubview:lbl]; 
    [lbl setBackgroundColor:[UIColor clearColor]]; 
    [lbl setFont:[UIFont fontWithName:@"Helvetica-Bold" size:18]]; 
    [lbl release]; 


    UIImageView *imgV1=[[UIImageView alloc] initWithFrame:CGRectMake(44, 24, 70, 20)]; 
    [imgV1 setImage:[UIImage imageNamed:[dicToSet valueForKey:@"Rating"]]]; 
    [cell addSubview:imgV1]; 
    [imgV1 release]; 


    return cell; 
} 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 

    nxtPlcDtl=[[plcFullDtl alloc] initWithNibName:@"plcFullDtl" bundle:nil]; 
    nxtPlcDtl.dict=[[NSDictionary alloc] initWithDictionary:[tblArray objectAtIndex:indexPath.row]]; 
    nxtPlcDtl.Imgs = [Imgs objectAtIndex:indexPath.row]; 
    nxtPlcDtl.comment1 = [comment1 objectAtIndex:indexPath.row]; 
    nxtPlcDtl.vedio = [vedio objectAtIndex:indexPath.row]; 

    [self.navigationController pushViewController:nxtPlcDtl animated:YES]; 



    } 
+0

Je suis assez sûr que cela a été posté dans le mauvais fil. – TechZen