2016-07-14 4 views
2

У меня есть UITableViewCell и в этом загружать изображения, поэтому я хочу, чтобы изображения загружали асинхронные сигналы и показывали индикатор активации. Это время загрузки изображений очень велико, и все изображения загружаются после того, как изображения отображаются в виде таблицы. много раз снижается загрузка изображения и пользователь UIInterface висит. и не работаю над любым процессом в приложении. Я очень устал, я использовал библиотеку SDWebImage. пожалуйста, помогите, как это возможно, спасибоКак использовать SDWebImage

#import "UIImageView+WebCache.h" 

@interface pictureViewController() 
{ 
    NSArray*picarray; 
    NSArray*titlearray; 
    NSArray*idarray; 
} 

@end 

@implementation pictureViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[[self navigationController] navigationBar] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]}]; 

    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"background2.png"] forBarMetrics:UIBarMetricsDefault]; 

    _tableview.separatorColor = [UIColor yellowColor]; 

    NSURLRequest *req=[[NSURLRequest alloc]initWithURL:[NSURL URLWithString:@"http://edutimeapp.com/toshow/chamber-of-commerc/ws/fetch_gallery.php"]]; 
    response =[[NSMutableData alloc]init]; 
    [NSURLConnection connectionWithRequest:req delegate:self]; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [response appendData:data]; 
    NSLog(@"error receving data %@",response); 
} 

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 

} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSError *error; 

    //NSLog(@"Error in receiving data %@",error); 
    NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error]; 
    // NSLog(@"response data %@",json); 

     NSArray *results = [json objectForKey:@"status"]; 
     picarray = [results valueForKey:@"img_url"]; 
     titlearray = [results valueForKey:@"title"]; 
     // NSLog(@"my title is%@",titlearray); 
     idarray=[results valueForKey:@"id"]; 
     //NSLog(@"my galary id is%@",idarray); 
     [self.tableview reloadData]; 
} 


// Do any additional setup after loading the view, typically from a nib. 
- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [picarray count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // NSLog(@"tableview cell"); 
    picture_viewcontrollerCell *cell = [tableView dequeueReusableCellWithIdentifier:@"htr"]; 
    if (cell==nil) 
    { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"Cell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 
    } 

    //NSData* imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString: [picarray objectAtIndex:indexPath.row]]]; 
    // UIImage* image = [[UIImage alloc] initWithData:imageData]; 
    //cell.picture.image =image; 

    cell.titlelbl.text=[NSString stringWithFormat:@"%@",[titlearray objectAtIndex:indexPath.row]]; 

    NSURL*url= [[picarray objectAtIndex:indexPath.row]valueForKey:@"img_url"]; 
    [cell.picture setContentMode:UIViewContentModeScaleAspectFill]; 
    [cell.picture sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"Placeholder.jpg"]]; 


    return cell; 
} 

@end 

ответ

2

Вы должны попробовать это (Показать activityIndicator & Загрузить изображение с помощью SDWebImage) -

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // NSLog(@"tableview cell"); 
    picture_viewcontrollerCell *cell = [tableView dequeueReusableCellWithIdentifier:@"htr"]; 
    if (cell==nil) 
    { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"Cell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 
    } 

    cell.titlelbl.text=[NSString stringWithFormat:@"%@",[titlearray objectAtIndex:indexPath.row]]; 

    NSURL*url= [NSURL URLWithString:[NSString stringWithFormat:@"%@",[picarray objectAtIndex:indexPath.row]]]; 

    [cell.picture setContentMode:UIViewContentModeScaleAspectFill]; 

    [cell.picture setShowActivityIndicatorView:YES]; 

    [cell.picture setIndicatorStyle:UIActivityIndicatorViewStyleGray]; 

    [cell.picture sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeHolder.png"] options:indexPath.row == 0 ? SDWebImageRefreshCached : 0]; 

    return cell; 

} 
+0

'[<__ NSCFString 0x7aff3ea0> valueForUndefinedKey:]: этот класс не является ключевым значением, совместимым с кодировкой для ключа img_url.' –

+0

изменить эту строку NSURL * url = [NSURL URLWithString: [[picarray objectAtIndex: indexPath.row] valueForKey: @ "img_url"]]; с вашей предыдущей строкой и проверить, существует ли эта ошибка или нет .. проверьте обновленную строку в моем коде .. –

+0

'[<__ NSCFString 0x79f168a0> valueForUndefinedKey:]: этот класс не является ключевым значением, совместимым с кодировкой для ключа img_url.' та же ошибка показать ниже –

0

Вы уверены, что ваш код компилируется? В вашем cellForRowAtIndexPath я вижу [cell.picture sd_setImageWithURL:imageData placeholderImage:[UIImage imageNamed:@"Placeholder.jpg"]]; , когда вы прокомментировали свое объявление imageData.

Даже если вы не комментировали, эта линия должна быть

[cell.picture sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"Placeholder.jpg"]]; 
+0

Извините редактировать мой код. пожалуйста, снова просмотрите мой вопрос –

0

вы должны использовать

NSURL*url= [[picarray objectAtIndex:indexPath.row]valueForKey:@"img_url"]; 
[cell.picture setContentMode:UIViewContentModeScaleAspectFill]; 
[cell.picture sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"Placeholder.jpg"]]; 

вместо

NSURL*url= [[picarray objectAtIndex:indexPath.row]valueForKey:@"img_url"]; 
[cell.picture setContentMode:UIViewContentModeScaleAspectFill]; 
[cell.picture sd_setImageWithURL:imageData placeholderImage:[UIImage imageNamed:@"Placeholder.jpg"]]; 

вы должны пройти по прямой ссылке вместо of imageData

+0

Отредактированный мой код, пожалуйста, chek –

+0

@ A.Kumawat да, надеюсь, что он может нормально работать –

0

Прочтите этот код:

  1. Добавить UIActivityIndicatorView в cellview cell.
  2. Изменен следующий код в вашем cellForRowAtIndexpath.

    cell.activityIndicator.center = imageView.center; 
    cell.activityIndicator.hidesWhenStopped = YES; 
    NSURL *url= [[picarray objectAtIndex:indexPath.row]valueForKey:@"img_url"]; 
    [cell.picture sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder.png"] 
             completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { 
             [cell.activityIndicator stopAnimating]; 
             }]; 
    [cell.picture addSubview:activityIndicator]; 
    [cell.activityIndicator startAnimating]; 
    
+0

Объявлен в классе UITableViewCell «activityIndicator»? –

+0

@ A.Kumawat Да, добавьте его в UITableViewCell. –

+0

последняя строка [activityIndicator startAnimating]; нет объявлено –

Смежные вопросы