2015-02-28 5 views
0

У меня есть UITableView, заполненный ячейками из подкласса UIB под UIBableViewCell. Я получаю каждый так:Использование iOS loadNibName для извлечения подкласса UITableViewCell

+(id) getClassObjectFromNib:(NSString*) nibName subclassOf: (Class) cls owner:(id)own 
{ 
    id result = nil; 
    NSArray* topLevelObjects = [[NSBundle mainBundle] 
       loadNibNamed:nibName 
       owner:own 
       options:nil]; 
    for (id currentObject in topLevelObjects) 
    { 
     if ([currentObject isKindOfClass:cls]) 
     { 
      result = currentObject; 
      [result retain]; 
      break; 
     } 
    } 
    return result; 
} 

Мой вызов выглядит следующим образом:

@interface TargetViewController : UITableViewController 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    NSString *CellIdentifier = [TargetCell defaultReuseIdentifier]; 
    TargetCell* cell = (TargetCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = (TargetCell*) [UtilityHelper getClassObjectFromNib:CellIdentifier subclassOf:[UITableViewCell class] owner:self]; 
    } 
    if (nil != cell) 
    { 
     // Other initialization code for cell controls 
     cell.showsReorderControl = 1; 
    } 
    return cell; 
} 

Но «dealloc» никогда не вызывается на клетках, когда их вид разгружает. Если я удаляю «Сохранить» выше, вызывается dealloc, но приложение вылетает, когда ячейка удаляется индивидуально (через swipe) из UITableView (сбой из-за сообщения на удаленный элемент).

За исключением случая единственного удаления, освобождение элементов происходит при выгрузке вида. Ошибка - «[TargetCell _setDeleteAnimationInProgress:]: сообщение отправлено на освобожденный экземпляр».

+0

Пожалуйста, добавьте пример, в котором вы используете этот метод. Также добавьте интерфейс объекта, переданного как 'owner' –

+0

Есть ли причина, по которой вы не используете ARC? Я рекомендую вам использовать его, и тогда это зависит от того, как вы храните его в экземпляре, который вызывает вашу функцию. – oren

+0

Обновлен для добавления примера использования. – dhovel

ответ

0

Я обнаружил, что проблема возникла из-за перезагрузки представления таблицы как части операции удаления строки (в commitEditingStyle).

[self.tableView reloadData]; 

Это, кажется, работает для стандартных UITableViewCells, но не работает, когда клетка является подклассом загружен с XIB. Теперь я просто изменяю источник данных, удаляю строку (используя deleteRowsAtIndexPaths) и возвращаюсь.