2013-03-27 3 views
0

У меня есть эта действительно странная проблема.Пользовательский UITableViewCell с UIImageView не загружает изображение для определенных ячеек

В основном у меня есть подкласс UITableViewCell, который написан и связан некоторыми выходами с Nib.

подкласс Cell.h

@property (weak, nonatomic) IBOutlet UIImageView *myImageView; 

подкласс Cell.m

@synthesize myImageView = _myImageView; // do i need this? 


- (void) setUpCell... image:(UIImage*)image 
{ 
     if(image) 
     self.myImageView.image = image; 
    else 
     self.myImageView.image = nil; 
} 

В контроллере представления, который управляет вид таблицы для ячейки,

Я зарегистрировался с Nib, используя следующий код:

[self.tableView registerNib:[UINib nibWithNibName:pathToNibForBaseMenuCell bundle:nil] forCellReuseIdentifier:identifierForBaseMenuCell]; 

В cellForRowAtIndexPath, я из очереди в камеру и установить изображение ...

CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:identifierForBaseMenuCell]; 

switch (indexPath.section) { 


    case 2: 
     [cell setUpCell...image:self.cogWheelImageForSettingsIcon]; 
     break; 

    default: 
     break; 
} 

return cell; 

}

Странно, что у меня есть 10 ячеек в секции 2 (как описано выше), и я установил они идентичны, некоторые ячейки показывают значок зубчатого колеса, а некоторые нет! Прокрутка этих ячеек внутри и вне поля зрения, похоже, изменяет, какие ячейки показывают значок, а какие нет.

Это означает, что регистрация ячейки, включая настройку идентификатора повторного использования, установление подкласса в файле nib, все эти виды прекрасны (общие ошибки).

Эта модель поведения, мне кажется, что память, отведенная - как будто что-то быть высвобождены где-то ...

Вот картинка, чтобы проиллюстрировать, что я имею в виду:

enter image description here

Пожалуйста Помогите!

Благодаря

Vb

Edit:

OK только, чтобы быть ясно, им не с помощью каких-либо данных, но с этой таблицей, но, несмотря на то, что нет никаких причин, почему я эти шестеренки не должен» не появляться!

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
return 3; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
switch (section) { 
    case 0: 
     return 1; 
     break; 

    case 1: 
     return 10; 
     break; 

    case 2: 
     return 10; 
     break; 

    default: 
     return 0; 
     break; 
} 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:identifierForBaseMenuCell]; 

switch (indexPath.section) { 
    case 0: 
     [cell setUpCell... text:@"Username" image:nil]; 
     break; 

    case 1: 
     [cell setUpCell... text:@"Magazine" image:nil]; 
     break; 

    case 2: 
    { 
     NSString* str = [NSString stringWithFormat:@"Settings: %d",indexPath.row]; 
     [cell setUpCell... text:str image:self.cogWheelImageForSettingsIcon]; 
     break; 
    } 

    default: 
     break; 
} 

return cell; 
} 

Выход, который ...

enter image description here

Я считаю, что если установка им то же изображение для всех ячеек, которые находятся в 2-ом разделе «Настройки», то почему только некоторые из них показывают изображение?

Пользовательский сотовый класс:

@interface CustomCell : UITableViewCell 
@property (weak, nonatomic) IBOutlet UIImageView *backgroundImageView; 
@property (weak, nonatomic) IBOutlet UILabel *mainLabel; 
@property (weak, nonatomic) IBOutlet UILabel *arrowView; 
@property (weak, nonatomic) IBOutlet UIImageView *myImageView; 
- (void) setUpCelltext:(NSString*)text image:(UIImage*)image; 


@implementation CustomCell 

- (void) setUpCelltext:(NSString*)text image:(UIImage*)image 
{ 
self.backgroundImageView.image = [UIImage imageNamed:pathForBackgroundImage]; 
self.myImageView.layer.cornerRadius = kCornerRadiusOfImageView; 
self.myImageView.layer.masksToBounds = YES; 

if(image) 
    self.myImageView.image = image; 
else 
    self.myImageView.image = nil; 

NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObject:self.fontForText forKey:NSFontAttributeName]; 
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:text attributes:attrsDictionary]; 
self.mainLabel.attributedText = attrString; 
} 
@end 

Клетки имеют собственные шрифты, вид с стрелка, фон вид - все они работают, как они должны! Они меняются в зависимости от раздела. Его просто изображение, которое не работает.Вы можете видеть, что эта функция, вызываемая cellForRowAtIndexPath, либо установит образ, если он предоставлен, либо установит обратное изображение в нуль, если это не так.

+0

Просто комментарий по вопросу, скрытый в коде, вам больше не нужно * @ synhesize * начиная с последних версий Objective-C. Это будет сделано автоматически с помощью соглашения «_» – rdurand

+0

спасибо, я удалил его! – Vazzyb

+0

Похоже, вы каждый раз передаете 'self.cogWheelImageForSettingsIcon' в свой источник данных' UITableView', поэтому я не вижу, как вы можете не иметь каждую ячейку с изображением значка. – RileyE

ответ

1

Оказывается, проблема связана с использованием 'imageView' в качестве имени моего imageView в моем nib. Это было позже изменено, но исходная связь была связана с переменной экземпляра UITableViewCell, а не с Custom Cell.

Мораль истории: не вызывайте образ изображения вашей пользовательской ячейки таблицы «imageView»!

+0

У меня была такая же проблема. Убедившись, что отношение установлено на раскадровке после присвоения имени атрибуту класса TableViewCell с правильным именем подкласса, исправлена ​​моя проблема. пс. Я заметил пустое отношение IBOutlet в коде, когда был уверен, что все в порядке. – mass

0

UITableViewCell s перерисовываются из старых ячеек с использованием dequeueReusableCellWithIdentifier:. Если вы не хотите, чтобы ячейки повторно использовались, вам нужно будет инициализировать новую ячейку каждый раз в вашей функции tableView:cellForRowAtIndexPath:.

Однако, если вы хотите повторно использовать ячейки (рекомендуется), вы должны называть свою функцию - (void) setUpCell... image:(UIImage*)image каждый раз внутри вашего tableView:cellForRowAtIndexPath:, чтобы гарантировать, что изображение настроено только на правильные ячейки.

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

Ex: ячейка создана в строке 2 и имеет изображение значка. Ячейка 2 отключена от экрана и теперь используется для строки 16. Строка 16 не должна иметь изображение, но ячейка по-прежнему считает, что это одна и та же ячейка из строки 2 и продолжает показывать ее изображение.

Если вы хотите, чтобы каждая ячейка была повторно использована, а также имела уникальные данные для каждого, используйте только внешний набор данных (например: NSArray), который предоставляет информацию, необходимую для рисования ячейки и передачи этой информации в ячейку каждый раз, а не в зависимости от информации, которую вы даете ячейке при ее создании.

+0

Но это именно то, что я делаю. Последний блок кода находится внутри моего cellForRowAtIndexPath. Каждая ячейка, которая собирается перейти во вторую секцию, имеет для нее вызов setUpCell. – Vazzyb

+0

@Vazzyb Oh. Вы сделали это неправильно. Вам нужно вытащить из набора данных. Вы вытаскиваете данные ячейки. Ячейка может быть создана и повторно использована любой строкой, поэтому вам нужен внешний набор данных, который вы ссылаетесь на свойство 'indexPath.row' – RileyE

+0

@Vazzyb. Пожалуйста, прочитайте мое редактирование. Если вам нужен пример, отправьте свой подкласс и полный код 'tableView: cellForRowAtIndexPath: '. – RileyE

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