Пользовательский UITableViewCell imageView не обновляется после setImage - PullRequest
0 голосов
/ 23 сентября 2010

У меня есть пользовательский класс UITableViewCell, объект модели которого выполняет асинхронную загрузку изображения, которое должно отображаться в ячейке. Я знаю, что у меня правильно подключены розетки в IB для WidgetTVC, я знаю, что данные изображений правильно возвращаются с моего сервера, и я также выделил / init'd UImage widget.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 для объекта модели Widget асинхронно (упрощенно):

 (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 ]

0 голосов
/ 24 сентября 2010

Возможно, лучшим решением было бы, чтобы объект вашей модели имел изображение в качестве свойства, а экранный объект подписывался на изменения свойства изображения через KVO и обновлялся при каждом изменении свойства изображения.

0 голосов
/ 24 сентября 2010

ОК, здесь произошла пара ошибок.Спасибо bosmacs и Эду Марти, поскольку оба ваших комментария были использованы для решения проблемы.

Сначала я добавил метод к объекту Widget для асинхронного получения логотипа:

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

И мой собственный класс AsyncImageFetch выглядит следующим образом:

+ (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;
}

НаконецСогласно Эд, я добавил это в метод configureWithWidget, который помогает настроить мой WidgetTVC:

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

И когда наблюдается изменение, я обновляю imageView и вызываю [self setNeedsDisplay].Работает как шарм.Как я могу дать вам оба очка?

0 голосов
/ 23 сентября 2010

В didReceiveImage: вы изменяете только локальный указатель anImage. Вам необходимо установить свойство image вашего UIImageView, чтобы обновить отображаемое. Вместо того чтобы хранить ссылку на UIImage вашего виджета, передайте ссылку на UIImageView, а в didReceiveImage: сделайте что-то вроде

UIImageView *imageView = (UIImageView*)[request.userInfo objectForKey:@"imageView"]; 
UIImage *newImage = [UIImage imageWithData:[request responseData]];
imageView.image = newImage;
...