#ios #uitableview #nsmutablearray
#iOS #uitableview #nsmutablearray
Вопрос:
Итак, у меня был этот код в моем SpecialOfferCell.h
#import <UIKit/UIKit.h>
#import "AFImagePager.h"
@interface SpecialOfferCell : UITableViewCell<AFImagePagerDataSource,AFImagePagerDelegate>
@property (nonatomic, retain) NSMutableArray *arrayImages;
@property (nonatomic) NSInteger offer_id;
-(void)loadImages;
@property (weak, nonatomic) IBOutlet AFImagePager *imageIcons;
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
@property (weak, nonatomic) IBOutlet UILabel *descLabel;
@end
и это файл реализации
#import "SpecialOfferCell.h"
@implementation SpecialOfferCell
@synthesize arrayImages;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
}
return self;
}
- (void)awakeFromNib
{
// Initialization code
self.imageIcons.delegate=self;
self.imageIcons.dataSource=self;
}
-(NSArray*)getArrayImages{
return [NSArray arrayWithArray:arrayImages];
}
#pragma mark - AFImagePager DataSource
- (NSArray *) arrayWithImageUrlStrings
{
return [self getArrayImages];
}
- (UIViewContentMode) contentModeForImage:(NSUInteger)image
{
return UIViewContentModeScaleAspectFill;
}
- (UIImage *) placeHolderImageForImagePager{
return [UIImage imageNamed:@"stub_dashboard"];
}
-(void)loadImages{
NSLog(@"offer id :%d",self.offer_id);
NSLog(@"arrayImages:%d",arrayImages.count);
@try {
if (arrayImages.count==0) {
NSError* error;
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init] ;
[request setURL:[NSURL URLWithString:[appConfig URL_GET_OFFER_GALLERY]]];
NSString *post = [NSString stringWithFormat:@"{"hotel_id":"%@","key":"%@","offer_id":%ld}",@"ayodya",[appConfig API_KEY],(long)_offer_id];
NSLog(@"%@",post);
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; // multipart/form-data
[request setHTTPBody:postData];
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
//NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
//NSLog(@"%@",returnString);
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:returnData options:kNilOptions error:amp;error];
arrayImages=[[NSMutableArray alloc]init];
NSMutableArray *arrayImagesTemp=[[NSMutableArray alloc]init];
arrayImagesTemp=[json objectForKey:@"galeries"];
for (int i=0; i<arrayImagesTemp.count; i ) {
NSDictionary * Object=[[NSDictionary alloc]init];
Object=[arrayImagesTemp objectAtIndex:i];
[arrayImages addObject:[Object objectForKey:@"image"]];
}
[self.imageIcons reloadData];
}
}
@catch (NSException *exception) {
}
}
@end
Поэтому, когда я вызвал эту пользовательскую ячейку в UITableViewController, изображение массива использовало массив, который использовался ранее, поэтому при инициализации новой ячейки массив не обновлялся. Почему это так? это потому, что dequeueReusableCellWithIdentifier ?
Источник данных:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSDictionary * Object=[[NSDictionary alloc]init];
Object=[array objectAtIndex:indexPath.row];
static NSString *CellIdentifier = @"SpecialOfferCell";
SpecialOfferCell *cell = (SpecialOfferCell *)[tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
cell.titleLabel.text=[Object objectForKey:@"offer_title"];
[cell setOffer_id:[[Object objectForKey:@"offer_id"]integerValue]];
[cell performSelectorInBackground:@selector(loadImages) withObject:nil];
return cell;
}
Итак, чего я собираюсь добиться, так это того, что когда ячейка загрузит изображения, она не будет загружаться снова.
Комментарии:
1. Привет, не могли бы вы также вставить код реализации источника данных в виде таблицы?
2. Привет @NagaMalleshMaddali Я обновил код. Спасибо.
Ответ №1:
В вашей специальной ячейке, которую вам необходимо реализовать prepareForReuse
здесь, вы можете сбросить любые данные, такие как массив изображений
Комментарии:
1. но сброс данных приведет к тому, что метод LoadImages будет вызываться снова и снова. в моем случае после третьей ячейки. Каков наилучший подход для этого? Спасибо.
Ответ №2:
Прежде всего, эта часть кода бесполезна:
if (cell == nil)
{
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
}
Вы должны создать новую ячейку вместо того, чтобы снова удалять ее из очереди.
Я не знаю, чего вы действительно хотите достичь. Есть два варианта:
- В
prepareForReuse
вы можете удалить изображения, чтобы загрузить их сноваloadImages
. - Вы не удаляете изображения — в этом случае, когда ячейка используется повторно, в ней ранее загружены изображения, поэтому они в основном случайны.
Но если вам нужно загружать изображения с сервера только один раз, вы можете создать словарь и каждый раз loadImages
проверять, были ли ваши изображения уже загружены, и получать их из вашего словаря. Я правильно понимаю?
Комментарии:
1. Каждая часть ячеек содержит разные изображения, поэтому здесь я использовал AFImagePager, поэтому я передал идентификатор каждого offer_id в SpecialOfferCell.m для загрузки изображений на основе его offer_id. Решение 1: я не собираюсь удалять изображения, все, что я хочу, это когда все изображения будут загружены в каждую ячейку, она не будет загружать изображения снова. Решение 2, третья ячейка будет содержать изображения из первой ячейки.
2. Итак, что вам нужно сделать, это сохранить ссылку на ваш массив изображений в каком-либо словаре, где ключ — это имя вашего предложения или другой уникальный идентификатор (например, indexPath), а в «LoadImages» вы пытаетесь загрузить их из словаря и загрузить их с сервера, когда dictionary [yourKey] имеет значение null. Правильно ли я понимаю вашу проблему?