2010-09-23 3 views
0

У меня есть пользовательский класс UITableViewCell, модельный объект которого выполняет асинхронную загрузку изображения, которое должно отображаться в ячейке. Я знаю, что у меня есть порты, подключенные должным образом в IB для WidgetTVC, я знаю, что данные изображения правильно возвращаются с моего сервера, и я также выделяю/init'd widget.logo UIImage. Почему изображение всегда пустое, а затем в моем TableViewCell? Заранее спасибо.Пользовательский UITableViewCell imageView не обновляется после setImage

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

финально Я получил метод обратного вызова, который устанавливает свойство логотип 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; 
} 
+0

Должен ли я передавать указатель на указатель в userInfo, чтобы класс async мог заполнить значение UIImage? –

+0

Думаю, мне может потребоваться больше кода, чтобы ответить на этот вопрос. Ваш комментарий над заключительным фрагментом кода говорит «метод обратного вызова, который задает свойство UIImage логотипа на объекте модели Widget» - но я не вижу ничего, что могло бы установить свойство логотипа на что-либо в этом методе. Я не знаком с ASIHTTPRequest, поэтому я могу ошибаться, но весь этот метод кажется полностью пассивным, т. Е. Он ничего не делает. Но вы написали «(упрощенный)» над ним, поэтому, возможно, нам нужно увидеть больше кода. – Echelon

ответ

0

OK- здесь было несколько вещей. Благодаря bosmacs и Ed Marty оба ваших комментария были использованы для решения проблемы.

Во-первых, я добавил метод к объекту 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]; 

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

0

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

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

Но он все еще не показывает изображение, даже когда я даю приложению много времени, чтобы убедиться, что свойство логотипа было установлено * до того, как * «configureWithWidget» вызывается при создании ячейки (которая вызывает setImage в представлении изображения ячейки) , –

+0

Что делать, если я храню (UIImage **) в userInfo? Будет ли это работать? Как мне изменить код для обработки этого (я немного нечеткий по всей логике указателя)? –

+0

Я не уверен, что понимаю, почему вы хотите получить доступ к изображению напрямую; не было бы проще сохранить указатель на изображение и установить его прямо?Попробовали ли вы установить изображение своего изображения прямо (с местным изображением) в 'cellForRowAtIndexPath:', чтобы убедиться, что он работает? – bosmacs

0

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

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