2009-12-02 6 views
1

Dans mon application, je charge des images dans les cellules d'une table. Mais, quand je fais défiler la table, l'image disparaît de la table (monte), elle ne sera pas là même si je reviens en arrière.L'image sur uitableview est perdue après le défilement

customCell.h

#import <UIKit/UIKit.h> 
@interface CustomCell : UITableViewCell<UINavigationControllerDelegate, UIImagePickerControllerDelegate> { 
UIViewController *viewController; 
UIImageView *imageView; 
UIButton *button; 
@property (nonatomic, retain) IBOutlet UIImageView *imageView; 
@property (nonatomic, assign)UIViewController *viewController; 
@property (nonatomic, retain) IBOutlet UIButton *button; 
-(IBAction)selectExistingPicture1; 

@end 
} 

customCell.m

#import "CustomCell.h" 
    @implementation CustomCell 
@synthesize imageView; 
@synthesize viewController; 
@synthesize button; 
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { 
    [picker dismissModalViewControllerAnimated:YES]; 
} 

- (IBAction)selectExistingPicture1 { 
     if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary]) { 
     UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
     picker.delegate = self; 
     picker.allowsImageEditing = YES; 
     picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
     [self.viewController presentModalViewController:picker animated:YES]; 
     [picker release]; 
    } 
    else { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error accessing photo library" message:@"Device does not support a photo library" delegate:nil cancelButtonTitle:@"Drat!" otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 
    } 
} 

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo { 


    UIImage *thumbnail = [image _imageScaledToSize:CGSizeMake(80, 80) interpolationQuality:1]; 
    /*CGSize newSize = CGSizeMake(80, 80); 
    UIGraphicsBeginImageContext(newSize); 
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; 
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext();*/ 
    imageView.image = thumbnail; 

    [picker dismissModalViewControllerAnimated:YES]; 


} 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { 
     // Initialization code 
    } 
    return self; 
} 


- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 

    [super setSelected:selected animated:animated]; 

    // Configure the view for the selected state 
} 

- (void)dealloc { 
    [imageView release]; 
    [viewController release]; 
    [button release]; 

    [super dealloc]; 
} 


@end 

cameraViewController.h

#import <UIKit/UIKit.h> 

@interface Camera1ViewController : UIViewController <UITableViewDelegate,UITableViewDataSource> {  

} 

@end 

cameraViewController.m

#import "Camera1ViewController.h" 
#import "CustomCell.h" 

@implementation Camera1ViewController 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 

    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 


- (void)dealloc { 
    [i 
    [super dealloc]; 
} 


#pragma mark Table Data Source Methods 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 25; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CustomCellIdentifier = @"CustomCellIdentifier"; 

      CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CustomCellIdentifier] autorelease]; 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self 
                options:nil]; 
     for (id currentObject in nib){ 
      if ([currentObject isKindOfClass:[CustomCell class]]){ 
       cell = (CustomCell *)currentObject; 
       cell.viewController = self; 
       break; 
      } 
     } 

    } 
    //dont know what to do here. 
    return cell; 

} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return 100; 
} 


- (NSString *)tableView:(UITableView *)tableView 
titleForHeaderInSection:(NSInteger)section { 
    NSString *key = @"Album"; 
    return key; 
} 
@end 

Répondre

4

Votre problème est le plus probable en raison de la réutilisation des cellules et de ne pas les réinitialiser correctement quand ils reviennent à l'écran. OK, donc lorsqu'une cellule est hors de vue dans une vue de table, elle est déchargée pour économiser de la mémoire, quand vous choisissez de réutiliser une cellule avec seulement 1 identificateur, cela signifie qu'à chaque fois qu'une cellule qui utilise cet identificateur retourner une cellule de ce type (BUt ce n'est PAS la cellule d'origine que vous avez configuré la première fois) quand il revient un tour, vous devez supposer qu'il est "sale" et vous devez réinitialiser l'image et son contenu, si vous ne voulez pas obtenir des résultats indésirables comme vous le voyez. Une autre alternative (mais pas une bonne pour les vues de table avec beaucoup de cellules) est de donner à chaque cellule un identifiant unique, maintenant vous avez la garantie que vos cellules ne seront pas "sales" parce qu'il y a une correspondance un à un entre identificateur et cellules, l'inconvénient est que vous utiliserez beaucoup de mémoire, ce qui va à l'encontre du but de la réutilisation des cellules (c'est comme si vous ne réutilisiez pas les cellules) ... Espérons que cela aide

+0

merci beaucoup, mais je ne sais pas comment faire cela, si vous le savez pls mettre ici ... – Nithin

+0

lire le guide de programmation UITableView ici, il pourrait aider, http://developer.apple. com/iphone/bibliothèque/documentation/UserExperience/Conceptual/TableView_iPhone/Introduction/Introduction.html – Daniel

+0

aussi si vous postez votre code cellForRowAtIndexPath je peux probablement vous aider – Daniel

0

votre code dans le post précédent:

NSUInteger s= indexPath.section; 
//[cell setText:[NSString stringWithFormat:@"I am cell %d", indexPath.row]]; 

NSUInteger r = indexPath.row; 
    cell.imageView.image = nil; 
for (s;s==0;s++) 
for(r;r==0;r++) 
{   
     UIImage *img=imageView.image; 
    cell.imageView.image = img; 
    } 
return cell; 

}

Je ne suis pas sûr à quoi sert la boucle, mais chaque fois qu'une cellule doit être redessinée, vous définissez UIImageView de la cellule à imageView.image (je suppose que imageView est une propriété de votre UIViewController) donc vous êtes en train d'écraser ce qui est déjà là avec cette seule imageVoir

+0

Salut, merci pour la réponse. Je suis confondu avec la partie cellForRowAtIndexPath de mon propre code. Je ne sais pas quoi faire avec cette partie. J'utilise une cellule personnalisée, créant une propriété, imageView dans (customCell.h). La cellule a un imageView et un uibutton dedans. Je vais coller le code dans la question maintenant. Je définis une méthode d'action à partir de customCell.m pour la retouche du bouton (selectExistingPicture). – Nithin

Questions connexes