UIImageView не отображается в пользовательском UITableViewCell - PullRequest
0 голосов
/ 18 февраля 2011

Вот код:

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

static NSString *CellIdentifier = @"ConvoreCell";

ConvoreCell * cell = (ConvoreCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"ConvoreCell" owner:nil options:nil];
    for (id currentObject in topLevelObjects){
        if ([currentObject isKindOfClass:[UITableViewCell class]]){
            cell = (ConvoreCell *) currentObject;
            break;
        }
    }
}

NSMutableDictionary *cellValue = [results objectAtIndex:indexPath.row];

NSString *picURL = [[cellValue objectForKey:@"creator"] objectForKey:@"img"];
if ([picURL isEqualToString:@"https://secure.gravatar.com/avatar/1f043010eb1652b3fab3678167dc0487/?default=https%3A%2F%2Fconvore.com%2Fmedia%2Fimages%2Feric.png&s=80"])
    picURL = @"https://convore.com/media/images/eric.png";

if ((picURL != (NSString *) [NSNull null]) && (picURL.length !=0)) {
    NSLog(@"%@", picURL);
    NSData *imgData = [[[NSData dataWithContentsOfURL:
                         [NSURL URLWithString:
                          picURL]] autorelease] retain];
    [cell.pic initWithImage:[[UIImage alloc] initWithData:imgData]];

} else {
    cell.pic = nil;
}


//NSLog(@"Name is : %@", [cellValue objectForKey:@"name"]);
cell.title.text = [cellValue objectForKey:@"name"];
cell.info.text = (@"Created by: %@", [[cellValue objectForKey:@"creator"] objectForKey:@"name"]);
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;



// Configure the cell...

return cell;

}

По какой-то причине изображение не отображается. Что я здесь не так делаю? URL изображения верный, я проверил.

Также я не хочу иметь вспомогательное представление на TableViewCell, я определил это как нет в IB, но он все еще обнаруживается ... я установил атрибут аксессуара в none уже

Ответы [ 4 ]

1 голос
/ 18 февраля 2011

у вас есть некоторые проблемы в вашем коде.

NSData *imgData = [[[NSData dataWithContentsOfURL:
                     [NSURL URLWithString:
                      picURL]] autorelease] retain];

первое не является реальной проблемой (может быть, по стечению обстоятельств ?!), но уродливо и запутанно.избавиться от авто-релиза и сохранить.Объект, который вы получаете из dataWithContentsOfURL: уже выпущен автоматически.


[cell.pic initWithImage:[[UIImage alloc] initWithData:imgData]];

И ваша реальная проблема может быть в этом.Из того, что я знаю, вы должны вызывать init ровно один раз;после того, как вы выделили объект.

Так что, если cell.pic является UIImageView, я бы попытался изменить код на что-то вроде этого:

cell.pic.image = [[[UIImage alloc] initWithData:imgData] autorelease];

Как только вы увидите свойизображения вы должны изменить свой код так, чтобы он сохранял изображения в данных, которые вы используете для заполнения ячейки.Вы загружаете изображение каждый раз, когда появляется ячейка.Это то, что вы не должны делать.Но это за пределами этого вопроса.

РЕДАКТИРОВАТЬ:

Также я не хочу иметь вспомогательное представление на TableViewCell, я указал это как нет в IB, но он все еще отображается ... я уже установил атрибут аксессуара в значение none

Вы делаете?Но я вижу эту строку кода:

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
0 голосов
/ 18 февраля 2011

Проблема, вызывающая ваш немедленный сбой, заключается в том, что перо для ConvoreCell пытается установить объявленный вами IBOutlet, но не находит способа установить его. Я бы проверил, что вы синтезировали свой рис. Здесь есть и другие проблемы. Линия

    [cell.pic initWithImage:[[UIImage alloc] initWithData:imgData]];

неправильно; Вы не вызываете init для объекта, который уже существует, но только когда вы выделяете объект. Сделать что-то вроде

cell.pic = [[[WhateverClassPicIS alloc] initWithImage:[[UIImage alloc] initWithData:imgData]];

Кроме того, вы используете NSData dataWithContentsOfURL в основном потоке. Это заблокирует ваш пользовательский интерфейс на неопределенное время при подключении к сети. Вместо этого используйте асинхронные вызовы.

0 голосов
/ 18 февраля 2011

Вы не показываете свой метод cellForRowAtIndexPath, который является ключом к анализу происходящего.Типичная парадигма состоит в том, что объекты UITableViewCell повторно используются UITableView.Вы должны установить UIImage в ячейку, когда UITableView вызывает cellForRowAtIndexPath.

0 голосов
/ 18 февраля 2011

Вы сможете получить UIImage, просто

[cell.pic initWithImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSUrl NSURL picURL]]]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...