简体   繁体   English

滚动后,uitableview上的图像丢失了

[英]Image on uitableview lost after scrolling

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 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 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 cameraViewController.h

#import <UIKit/UIKit.h>

@interface Camera1ViewController : UIViewController <UITableViewDelegate,UITableViewDataSource> {      

}

@end

cameraViewController.m 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

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. 好的,所以当一个单元格在一个tableview中离开视图时,它会被卸载以节省内存,当你选择重复使用只有一个标识符的单元格时,这意味着每次使用该标识符的单元格出现在屏幕上时,tableview将返回这种类型的单元格(它不是你第一次配置的原始单元格)当它返回一个圆形时你必须假设它是“脏”的,你必须重新初始化图像及其内容,如果你没有得到你所看到的不受欢迎的结果。

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 另一个替代方案(虽然对于包含大量单元格的tableviews而言不是很好)是给e ech单元格一个唯一的标识符,现在你可以保证你的单元格不会“脏”,因为标识符和单元格之间的一对一映射,向下这方面的一部分就是你会耗尽大量的记忆,这会破坏重复使用细胞的目的(好像你根本没有重复使用细胞)...希望这有助于

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 我不确定循环是什么,但是任何时候需要重新绘制一个单元格,你将单元格的UIImageView设置为imageView.image (我假设imageView是你的UIViewController的一个属性)所以从本质上说你覆盖了已经存在的东西单个imageView

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM