2015-12-23 3 views
0

Я добавил табличный вид, и я отображаю изображение в ячейках. Я также добавил этот код:Swift - не работает правильно IOS 9.2

Так, чтобы ячейки изменялись в зависимости от изображения.

Когда я запускаю мое приложение, хотя, я получаю это: [! [Введите описание изображения здесь] [1]] [1]

И образы не загружаются до тех пор пока я начинаю прокрутке ... Если я прокручиваю вниз на половину страницы затем вернуться к началу, я получаю это: Что является правильным

[2]

Любые идеи [[введите описание изображения здесь] [2]]? Я исследовал Google и пробовал странное решение для более старых версий Xcode, но ничего не работает!

Вот остальная часть моего кода из TableViewController:

+0

изображения являются избыточными, они делают ваш вопрос трудно читать. Удалите изображения и поместите свою реализацию, в частности «cellForRowAtIndexPath». – Kof

+0

, если высота ваших изображений фиксирована на постоянное значение, а ваши ограничения правильно установлены, высота ячейки должна быть правильно рассчитана. может быть, происходит то, что ваши изображения перекрываются со следующей ячейкой, потому что у них нет свойства 'clipToBounds = true' – Lucho

+0

@Lucho, как бы установить это свойство? – Charles

ответ

2

Image правильно не загружен в cellForRowAtIndexPath метод делегата, вы (вероятно) загрузив изображение в фоновом режиме, поэтому cellForRowAtIndexPath возвращается прежде, чем изображение готов.

Скачано изображение, вероятно, кэшировано, так что в следующий раз он будет загружен правильно.

post.downloadImage() Лучше иметь обратный вызов для вызова при загрузке изображения, чтобы назначить загруженное изображение в соответствующую ячейку.

Имейте в виду, что пользователь может прокрутить эту ячейку на экране до загрузки изображения, поэтому лучше использовать уникальный идентификатор, чтобы прервать загрузку присвоенного изображения, если ячейка уже изменилась.

Вот пример для метода, который загружает изображение в фоновом режиме, а затем назначает его в клетку -

+ (void)loadImage:(NSString *)imageUrl onComplete:(void(^)(UIImage *image, BOOL loaded, NSString *callIdentifier))callback callIdentifier:(NSString *)callIdentifier { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul), ^{ 
     [self downloadPicture:url onComplete:^(UIImage *image, BOOL loaded) { 
      dispatch_sync(dispatch_get_main_queue(), ^{ 
       callback(image, loaded, callIdentifier); 
      }); 
     }]; 
    }); 

    callback([UIImage imageNamed:@"placeholder"], NO, callIdentifier); 
} 

+ (void)downloadPicture:(NSString *)url saveTo:(NSString *)filePath onComplete:(void (^)(UIImage *image, BOOL loaded))onComplete { 
    NSError *error = nil; 
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url] options:NSDataReadingMappedAlways error:&error]; 
    if (!error) { 
     UIImage *image = [UIImage imageWithData:data scale:GTUserPictureScale]; 
     if (onComplete) 
      onComplete(image, YES); 
    } else { 
     NSLog(@"Error loading user picture: %@", [error description]); 
     if (onComplete) 
      onComplete([UIImage imageNamed:@"missing"], NO); 
    } 
} 

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    // ... 

    __weak MyClass *wself = self; 

    self.imageUrl = @"http://..."; 
    [self loadImage:self.imageUrl onComplete:^(UIImage *image, BOOL loaded, NSString *callIdentifier) { 

     @synchronized(wself) { 
      if ([callIdentifier isEqualToString:wself.imageUrl]) { 
       if (loaded) { 
        wself.image = image; 
       } 
      } else 
       NSLog(@"Expired load image request for id %@", callIdentifier); 
     } 

    } callIdentifier:self.imageUrl]; 

    // ... 
} 
+1

Я обновил свой код – Charles

+1

Спасибо, моя теория была правильной - вы загружаете изображение в метод cellForRowAtIndexPath', он, вероятно, работает в фоновом режиме и сохраняется в кеше (возможно, кеш UIImage?), Так что в следующий раз он будет загружен мгновенно , поскольку он уже был загружен. – Kof

+1

Он сохраняется в кэше UIImage, поэтому, что бы вы сказали, мне нужно сделать, чтобы исправить эту проблему? – Charles

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