Почему мой просмотр таблицы прерывается на 4-й записи? - PullRequest
0 голосов
/ 15 марта 2012

Это код, который у меня есть. Он отлично работает для первых 3 записей, затем для 4-й записи начинает отображать содержимое той же ячейки, что и другие ячейки, несмотря на правильность высоты каждой ячейки. Кто-нибудь может обнаружить какие-либо проблемы, которые я не вижу здесь? Cell.textLabel.text существует исключительно для целей тестирования и возвращается как правильный номер ячейки, даже если содержимое ячейки неверно. Поскольку он устанавливается одновременно с контентом, это заставляет меня поверить, что проблема не в cellForRowAtIndexPath.

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

    static NSString *CellIdentifier = @"Cell";

    JCell *cell = (JCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    UIImageView *imageView;
    if (cell == nil) {
        cell = [[JCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        imageView = [[UIImageView alloc] init];
        imageView.contentMode = UIViewContentModeCenter;

        [cell addSubview:imageView];

    }

    UIImage *image = [self.mediaDelegate largeThumbnailForMediaAtIndex:indexPath.row];
    imageView.frame = CGRectMake(0, IMAGE_SPACING, image.size.width, image.size.height);
    imageView.image = image;
    imageView.center = CGPointMake(cell.bounds.size.width / 2, imageView.center.y);

    cell.textLabel.text = [NSString stringWithFormat:@"%i", indexPath.row];

    return cell;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    int mediaHeight = [self.mediaDelegate heightForLargeThumbnailForMediaAtIndex:indexPath.row];    

    return mediaHeight + (IMAGE_SPACING * 2);
}

Это всегда будет JImage, потому что я еще не начал поддержку фильмов.

-(UIImage *)largeThumbnailForMediaAtIndex:(int)index
{
    id media = [self.media objectAtIndex:index];
    if ([media isKindOfClass:[JImage class]]) {
        JImage *image = media;
        return [image getLargeThumbnail];
    }
    else if ([media isKindOfClass:[JMovie class]]) {
        JMovie *movie = media;
        return [movie getLargeThumbnail];
    }
    else {
        return nil;
    }
}

-(UIImage *)getLargeThumbnail {
    if (self.largeThumbnail == nil) {
        UIImage *originalImage = [UIImage imageWithContentsOfFile:self.originalImage];
        UIImage *resizedImage = [originalImage imageScaledToFitSize:LARGE_THUMBNAIL_SIZE];
        self.largeThumbnail = @"Generating";
        dispatch_queue_t myQueue = dispatch_queue_create("LargeThumbnailQueue", 0);
        dispatch_async(myQueue, ^{
            NSString *filePath = [JImage writeImageToFile:resizedImage];
            self.largeThumbnail = filePath;
        });

        return resizedImage;

    }
    else if ([_largeThumbnail isEqualToString:@"Generating"]) {
        UIImage *originalImage = [UIImage imageWithContentsOfFile:self.originalImage];
        UIImage *resizedImage = [originalImage imageScaledToFitSize:LARGE_THUMBNAIL_SIZE];
        return resizedImage;
    }
    else {
        NSString *filePath = self.largeThumbnail;
        UIImage *image = [UIImage imageWithContentsOfFile:filePath];
        return image;
    }

}


+(NSString *)writeImageToFile:(UIImage *)image {

    NSData *fullImageData = UIImageJPEGRepresentation(image, 1.0);

    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Images/"];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL isDirectory = NO;
    BOOL directoryExists = [fileManager fileExistsAtPath:path isDirectory:&isDirectory];
    if (directoryExists) {
    } else {
        [fileManager createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:nil];
    }

    NSString *retinaSupport;
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2){
        retinaSupport = @"@2x";
    }

    NSString *name = [NSString stringWithFormat:@"%@%@.jpg", [JMedia generateUuidString], retinaSupport];
    NSString *filePath = [path stringByAppendingPathComponent:name];
    [fullImageData writeToFile:filePath atomically:YES];

    return filePath;
}

Любая помощь или помощь с этой проблемой очень ценится.

Ответы [ 3 ]

2 голосов
/ 15 марта 2012

при повторном использовании ячейки (т. Е. Вы не вводите, если (cell == nil) у вас нет imageView. ImageView будет равен нулю.

Добавьте тег для извлечения этого imageView приВы повторно используете свои клетки:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    JCell *cell = (JCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    UIImageView *imageView;
    if (cell == nil) {
        cell = [[JCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        imageView = [[UIImageView alloc] init];
        imageView.contentMode = UIViewContentModeCenter;
        imageView.tag = 1234;
        [cell addSubview:imageView];

    }
    imageView = [cell viewWithTag:1234];

    UIImage *image = [self.mediaDelegate largeThumbnailForMediaAtIndex:indexPath.row];
    imageView.frame = CGRectMake(0, IMAGE_SPACING, image.size.width, image.size.height);
    imageView.image = image;
    imageView.center = CGPointMake(cell.bounds.size.width / 2, imageView.center.y);

    cell.textLabel.text = [NSString stringWithFormat:@"%i", indexPath.row];
    return cell;
}
0 голосов
/ 15 марта 2012

Вы выделяете imageView для ячейки, только если она входит в

if (cell == nil)

блок. Поэтому после того, как просмотр таблицы создал пару экземпляров, он будет использовать их повторно, и к нему не будет добавлен imageView.

EDIT:

UIImageView *imageView;        <------------ imageView is nil
if (cell == nil) {
  cell = [[JCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

  imageView = [[UIImageView alloc] init];
  imageView.contentMode = UIViewContentModeCenter;

  [cell addSubview:imageView];

}

UIImage *image = [self.mediaDelegate largeThumbnailForMediaAtIndex:indexPath.row];
// At this point, imageView is still nil - not been initialised to anything
imageView.frame = CGRectMake(0, IMAGE_SPACING, image.size.width, image.size.height);
imageView.image = image;
imageView.center = CGPointMake(cell.bounds.size.width / 2, imageView.center.y);
0 голосов
/ 15 марта 2012

Разве вы не должны скорее

UIImage *image = [self.mediaDelegate largeThumbnailForMediaAtIndex:indexPath.row];
cell.imageView.frame = CGRectMake(0, IMAGE_SPACING, image.size.width, image.size.height);
cell.imageView.image = image;
cell.imageView.center = CGPointMake(cell.bounds.size.width / 2, imageView.center.y);

(или, по крайней мере, вы должны извлечь imageView из ячейки и не использовать то, что выглядит как переменная экземпляра)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...