Вопрос

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

Пользовательская ячейка.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
}

Пользовательская ячейка.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
Это было полезно?

Решение

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top