2013-03-07 2 views
3

Я добавил CustomImageView в UITableViewCell.UITableView reloadData crash

UITableViewCell *cell = nil; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell1"] autorelease]; 
    } 
    CustomImageView *customIV = [[CustomImageView alloc] init]; 
    [cell.contentView addSubView:customIV]; 
    [customIV release]; 

Но когда я пытаюсь перезагрузить табличное представление, возникает ошибка.

столбец с ошибкой такой же, как указано ниже.

enter image description here

Выходная строка выглядит следующим образом.

- [CustomImageView SuperView]: сообщение, отправленное высвобождены например 0x1f848f30

+2

попробуйте следующее: [cell.contentView addSubview: customIV]; – Vishal

+2

Можете ли вы разместить полный код 'cellForRowAtIndexPath'? –

+0

@ttotto Вам нужно добавить subview в представлении содержимого ячейки, а не в самой ячейке. См. Ответ iManan ниже. –

ответ

1
CustomImageView *customIV = [[CustomImageView alloc] initWithFrame:CGRectMake(x, y, w, h)]; 
[cell.contentView addSubView:customIV]; 

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

Надеюсь, это поможет вам.
Спасибо.

+1

Для чего это стоит, customIV будет протекать в этом случае. –

0

Эта ошибка возникает из-за того, что каждый раз CustomImageView объект создается при создании вашего cell.

так, лучший способ сначала инициализировать объект CustomImageView затем создать свой UITableView

, такие как,

CustomImageView *customIV положить его в .h file, а затем @synthesize его в .m File

(поместить этот код выше UITableView)

self.customIV = [[CustomImageView alloc] init]; 

Затем создайте UITableView

self.tablView = [[UITableView alloc]init]; 
. 
. 
. 
. 

И cellForRowAtIndexPath только добавить [cell.contentView addSubView:self.customIV];

+2

Это не работает, если пользовательское изображение должно отображаться более чем в одной строке. – rmaddy

+0

@ rmaddy- ya, но каждый раз, когда вы используете экземпляр CustomImageView в ячейке – iPatel

+1

Один вид не может отображаться в нескольких родительских представлениях. Поэтому невозможно иметь один экземпляр, если «CustomImageView» и добавить его в несколько строк в таблице. – rmaddy

1

Попробуйте Комментарий эта линия [customIV release]; & бежать, он не должен врезаться во время перезагрузки данных.

Причина в том, что каждый раз при попытке создать новый пользовательский вид & освобождает его, поэтому вызывает дополнительную нагрузку на систему. & происходит сбой.

+0

ваша идея хороша, но это полезно, когда OP release obj из customIV больше, чем один раз .. где OP выпускает его только один раз :) – iPatel

+0

Я знаю, что он выпускает объект один раз, но он будет выпускать объект и будет создавать объект каждый раз при умножении содержимого в строках таблицы. Итак, мой основной вопрос: зачем добавлять такой же CustomImageView в каждую ячейку? –

1

Вы хотите добавить картинку к ячейке. Измените код следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell1"]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell1"] autorelease]; 
     CustomImageView *customIV = [[CustomImageView alloc] init]; 
     [cell.contentView addSubView:customIV]; 
     [customIV release]; 
    } 

    return cell; 
} 

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