Изображение на uitableview теряется после прокрутки - PullRequest
1 голос
/ 02 декабря 2009

в моем приложении я загружаю изображения в ячейки таблицы. Но когда я прокручиваю таблицу, изображение исчезает из поля зрения таблицы (поднимается вверх), его там не будет, даже если я прокручиваю назад.

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

Ответы [ 2 ]

4 голосов
/ 02 декабря 2009

Ваша проблема, скорее всего, связана с тем, что вы повторно используете ячейки и неправильно восстанавливаете их, когда они возвращаются на экран. Итак, когда ячейка выходит из поля зрения в виде таблицы, она выгружается для сохранения памяти, когда вы выбираете повторное использование ячейки только с одним идентификатором, это означает, что каждый раз, когда ячейка, которая использовала этот идентификатор, появляется на экране, представление таблицы будет возвращать ячейка этого типа (но НЕ исходная ячейка, которую вы настроили в первый раз), когда она возвращается в раунд, вы должны предположить, что она «грязная», и вы должны повторно инициализировать изображение и его содержимое, если вы не получите нежелательные результаты, которые вы видите.

Другая альтернатива (хотя и не очень хорошая для табличных представлений с большим количеством ячеек) - дать каждой ячейке уникальный идентификатор, теперь вы гарантированно не будете «грязными» в своих ячейках, потому что между идентификатором и ячейками есть взаимно однозначное соответствие обратная сторона этого заключается в том, что вы будете использовать много памяти, что лишает цели повторного использования ячеек (как будто вы вообще не используете многократные ячейки) ... Надеюсь, это поможет

0 голосов
/ 03 декабря 2009

от просмотра вашего кода в предыдущем посте:

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;

}

Я не уверен, для чего предназначен цикл, но каждый раз, когда необходимо перерисовать ячейку, вы устанавливаете UIImageView ячейки на imageView.image (я предполагаю, что imageView - это свойство вашего UIViewController), поэтому, по сути, вы перезаписываете то, что уже там с этим единственным imageView

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