代码之家  ›  专栏  ›  技术社区  ›  Steve N

自定义UITableViewCell imageView在setImage之后未更新

  •  0
  • Steve N  · 技术社区  · 14 年前

    我有一个定制的UITableViewCell类,它的模型对象执行异步下载要在单元格中显示的图像。我知道我已经在IB中为widgetvc正确连接了出口,我知道图像数据正在从我的服务器正确返回,并且我已经分配了小部件.logo你的形象也一样。为什么我的tableViewCell中的图像总是空白?提前谢谢。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        Widget *theWidget = [widgetArray objectAtIndex:indexPath.row];
    
        static NSString *CellIdentifier = @"WidgetCell";
        WidgetTVC *cell = (WidgetTVC*)[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
        if(cell == nil)
        {
            [[NSBundle mainBundle] loadNibNamed:@"WidgetTVC" owner:self options:nil];
            cell = self.widgetTVC;
            self.widgetTVC = nil;
        }
    
        [cell configureWithWidget:theWidget];
    
        return cell;
    }
    

    在我的WidgetTVC类中,我有以下方法:

    - (void)configureWithWidget:(Widget*)aWidget {
        self.widget = aWidget;
        self.nameLbl.text = aWidget.name;
        [self.logoIvw setImage:aWidget.logo]; // logoIvw is the image view for the logo
    }
    

    最后,我得到了一个回调方法,它异步(简化)设置小部件模型对象的logo UIImage属性:

     (void)didReceiveImage:(ASIHTTPRequest *)request {
        // I pass a ref to the Widget's logo UIImage in the userInfo dict
        UIImage *anImage = (UIImage*)[request.userInfo objectForKey:@"image"];      
        UIImage *newImage = [UIImage imageWithData:[request responseData]];
        anImage = newImage;
     }
    
    3 回复  |  直到 14 年前
        1
  •  0
  •   bosmacs    14 年前

    didReceiveImage: ,仅修改本地指针 anImage image UIImageView 以更新显示的内容。而不是隐藏对小部件的 UIImage UIImageView视图 ,和 接收图像: 像这样做

    UIImageView *imageView = (UIImageView*)[request.userInfo objectForKey:@"imageView"]; 
    UIImage *newImage = [UIImage imageWithData:[request responseData]];
    imageView.image = newImage;
    
        2
  •  0
  •   Ed Marty    14 年前

    也许最好的解决方案是让模型对象将图像作为属性,而显示对象通过KVO订阅图像属性的更改,并在图像属性更改时更新自身。

        3
  •  0
  •   Steve N    14 年前

    首先,我向Widget对象添加了一个异步获取徽标的方法:

    - (void)asyncImageLoad {
        ...
        // logo is a UIImage
        [AsyncImageFetch fetchImage:&logo fromURL:url];
    }
    

    + (void)fetchImage:(UIImage**)anImagePtr fromURL:(NSURL*)aUrl {     
        ASIHTTPRequest *imageRequest = [ASIHTTPRequest requestWithURL:aUrl];    
        imageRequest.userInfo = [NSDictionary dictionaryWithObject:[NSValue valueWithPointer:anImagePtr] forKey:@"imagePtr"];
        imageRequest.delegate = self;
        [imageRequest setDidFinishSelector:@selector(didReceiveImage:)];
        [imageRequest setDidFailSelector:@selector(didNotReceiveImage:)];
        [imageRequest startAsynchronous];
    }
    
    + (void)didReceiveImage:(ASIHTTPRequest *)request {
        UIImage **anImagePtr = [(NSValue*)[request.userInfo objectForKey:@"imagePtr"] pointerValue];    
        UIImage *newImage = [[UIImage imageWithData:[request responseData]] retain];
        *anImagePtr = newImage;
    }
    

    最后,根据Ed,我将此添加到帮助设置WidgetVC的configureWithWidget方法中:

    [aCoupon addObserver:self forKeyPath:@"logo" options:0 context:nil];