views:

585

answers:

2

in my application, i'm loading images to the cells of a table. But, when i scroll the table, the image goes out of sight of the table(goes up), it wont be there even if i scroll back.

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
+1  A: 

Your problem is mostlikely due to you reusing cells and not reintializing them correctly when they come back on the screen. OK, so when a cell goes out of view in a tableview, it is unloaded to save memory, when you choose to reuse a cell with only 1 identifier it means that everytime a cell that used that identifier comes on screen the tableview will give back a cell of that type (BUt its NOT the original cell that you configured the first time around) when it comes back a round you must assume that it is "dirty" and you must reinitialize the image and its content, if you dont youll get undesired results like you are seeing.

Another alternative (though not a good one for tableviews with lots of cells) is to give e ach cell a unique identifier, now you are guaranteed your cells wont be "dirty" because theres a one to one mapping between identifier and cells, the down side of this is that you will be using up lots of memory, which defeats the purpose of reusing cells (its as if y ou werent reusing cells at all)... Hope this helps

Daniel
thanks a lot, but i dont know how to do that, if u know it pls put it here...
Nithin
read the UITableView programming guide here it might help, http://developer.apple.com/iphone/library/documentation/UserExperience/Conceptual/TableView_iPhone/Introduction/Introduction.html
Daniel
also if u post your cellForRowAtIndexPath code i can probably help you
Daniel
i've added my codes. And one more thing to say to all, i'm a newbie to the programming side, also now a trainee developer in a company. They have asked me to learn about iphone SDk and development myself. Noone here knows it. I'm really in agony. pls help. This is ma first assingnment
Nithin
A: 

from looking at your code in the previous post:

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;

}

i am not sure what the looping is for, but anytime a cell needs to be redrawn you are setting the cell's UIImageView to imageView.image ( I assume imageView is a property of your UIViewController) so in essence you are overwriting what is already there with that single imageView

John Stallings
Hi, thanks for the reply. I'm confused with the cellForRowAtIndexPath portion of my own code.I dont know what to do with that portion. I'm using custom cell, creating a property, imageView in that(customCell.h). The cell has an imageView and an uibutton in it. I'll paste the code in the question now. I'm defining an action method from the customCell.m for touch up of the button(selectExistingPicture).
Nithin