无法使用SDWebImage显示图像

时间:2012-06-02 07:32:57

标签: iphone objective-c ios xcode

新手到iPhone这里。 我有一个显示从rss提取的图像。我目前正在使用下面的代码,但可以减慢视图中加载元素的速度:

  for(int i=0; i<[bannerArray count]; i++){

       NSString *bannerImagestr = [[bannerArray objectAtIndex:i] BannerImage];
       bannerImagestr  = [ bannerImagestr  stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

      NSURL *banURL= [NSURL URLWithString:bannerImagestr];



       NSData *data = [NSData dataWithContentsOfURL:banURL];

       imgEventDetail = [[[UIImage alloc] initWithData:data] autorelease];


       [banEventDetailArray addObject:imgEventDetail];

 }NSLog(@"the  banEventDetailArray is %@",banEventDetailArray);

我尝试了SDWebImage api,使其加载速度快,但我无法获得图像。我一直在使用的代码如下:

   for(int i=0; i<[bannerArray count]; i++){

       NSString *bannerImagestr = [[bannerArray objectAtIndex:i] BannerImage];
       bannerImagestr  = [ bannerImagestr  stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

      NSURL *banURL= [NSURL URLWithString:bannerImagestr];


       [banIconImage setImageWithURL:banURL placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

      banImg=banIconImage.image;//<<<-------- updated here banImg is an instance of UIImage

       [banEventDetailArray addObject:banImg];

 }NSLog(@"the  banEventDetailArray is %@",banEventDetailArray);

我需要banEventDetailArray形式的UIImage,因为我在下面的代码中设置了这个数组,其中(UIImage *)作为参数

 [eventsdetailroundedButtonType setBackgroundImage:[banEventDetailArray objectAtIndex:numTimerTicks] forState:UIControlStateNormal];

请帮助我找到我错过的以及我可能出错的地方。

提前致谢。

更新:我已经替换了第二个代码块中的一行。即banImg = banIconImage.image;在第11行。

4 个答案:

答案 0 :(得分:1)

您可以使用图片网址作为密钥来查找缓存的图片:

UIImage *myCachedImage = [[SDImageCache sharedImageCache] imageFromKey:[NSString \
stringWithFormat:@"%@",banURL]];

答案 1 :(得分:0)

我想问题就在于这一行:

   [banIconImage setImageWithURL:banURL placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

   banImg=[[UIImage alloc]init];         // <-- here: empty image
   [banIconImage setImage:banImg];       // <-- here: overriding banURL image

因为你是:

  1. 首先,从网址获取图片;

  2. 用空的图像覆盖该图像。

  3. 请使用此代码:

       [banIconImage setImageWithURL:banURL placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
       [banEventDetailArray addObject:banIconImage];
    

    即,将检索到的图像添加到数组中,然后再使用它。

    您需要跟踪UIImageView,因为它是SDWebImage魔法发生的地方。实际上,该视图在获取图像时处理占位符的显示;当图像存在时,它会被替换。

    只有在获取实际图像后才能获得image属性,否则您只能获得占位符。

答案 2 :(得分:0)

为什么要将图像设置两次?没有意义。

 [banIconImage setImageWithURL:banURL placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

              banImg=[[UIImage alloc]init];
   [banIconImage setImage:banImg];

尝试删除第二个设置,应该是。

     [banIconImage setImageWithURL:banURL placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

编辑:逻辑仍然没有意义。您可能正在尝试将UIImageView的图像添加为数组中的对象,这意味着您的代码应该看起来像这样。

NSString *bannerImagestr = [[bannerArray objectAtIndex:i] BannerImage];
bannerImagestr  = [ bannerImagestr  stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

NSURL *banURL= [NSURL URLWithString:bannerImagestr];
[banIconImage setImageWithURL:banURL placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

[banEventDetailArray addObject:banIconImage.image];

在您决定不是您需要的代码之前尝试代码,显然您并不确切知道自己想要什么。如果这是您问题的答案,请将其标记为解决方案。

答案 3 :(得分:0)

您的数组不包含图像对象。相反,它保存指向UIImage对象的指针(引用)。如果你查看你的工作代码,你就有:

imgEventDetail = [[[UIImage alloc] initWithData:data] autorelease];

[banEventDetailArray addObject:imgEventDetail];

使用数据创建并添加imgEventDetail UIImage对象的新实例,然后将其添加到数组中。你需要为你的底层(不工作)代码做同样的事情。

在无效代码中尝试此操作:

 [banEventDetailArray addObject:banIconImage.image];  // array automatically retains.

所有假设您使用SDWebImage API正确下载图像。