2016-05-03 4 views
1

Я использую customUITableViewCell в моих UITableView. Проблема в том, что 'dequeueReusableCellWithIdentifier' returns nil, когда он должен вернуть уже созданную ячейку, по крайней мере, я так думаю.Почему dequeueReusableCellWithIdentifier возвращает nil после выделения ячеек?

Вот код:

...... 

    self.chattableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, width, height) style:UITableViewStylePlain]; 
    self.chattableView.separatorStyle=UITableViewCellSeparatorStyleNone; 
    self.chattableView.dataSource=self; 
    self.chattableView.delegate=self; 
    [self.view addSubview:self.chattableView]; 

...... 


-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    chatCellData* tempcelldata = self.cellDataArray[indexPath.row]; 
    NSString* reusestr =[NSString stringWithFormat:@"%d",tempcelldata.chattype]; 
    ChatTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reusestr]; 

    if(cell)//set cell data and change some label frame 
    { 
     [cell SetCellWithReuseIdentifier:reusestr andCellData:tempcelldata]; 
     NSLog(@"dequeueReusableCellWithIdentifier : %@ ",reusestr); 
    } 
    else//alloc cell 
    { 
     cell = [[ChatTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reusestr withCellData:tempcelldata]; 
     NSLog(@"alloc with Identifier:%@ ",reusestr); 
    } 
    return cell; 
} 

Когда я прокручивать tableview я получаю следующую информацию печати:

...... 
Demo[40891:4326063] dequeueReusableCellWithIdentifier : 4 
Demo[40891:4326063] dequeueReusableCellWithIdentifier : 4 
Demo[40891:4326063] alloc with Identifier:1 
Demo[40891:4326063] alloc with Identifier:5 
Demo[40891:4326063] alloc with Identifier:4 
Demo[40891:4326063] alloc with Identifier:4 
Demo[40891:4326063] alloc with Identifier:4 
Demo[40891:4326063] alloc with Identifier:2 
Demo[40891:4326063] alloc with Identifier:1 
Demo[40891:4326063] alloc with Identifier:5 
Demo[40891:4326063] alloc with Identifier:2 
Demo[40891:4326063] alloc with Identifier:32 
Demo[40891:4326063] alloc with Identifier:1 
Demo[40891:4326063] alloc with Identifier:1 
Demo[40891:4326063] alloc with Identifier:32 
Demo[40891:4326063] alloc with Identifier:4 
Demo[40891:4326063] dequeueReusableCellWithIdentifier : 4 
Demo[40891:4326063] alloc with Identifier:32 
Demo[40891:4326063] alloc with Identifier:4 
Demo[40891:4326063] alloc with Identifier:4 
Demo[40891:4326063] alloc with Identifier:4 
Demo[40891:4326063] dequeueReusableCellWithIdentifier : 32 
Demo[40891:4326063] alloc with Identifier:1 
Demo[40891:4326063] alloc with Identifier:32 
Demo[40891:4326063] dequeueReusableCellWithIdentifier : 1 
Demo[40891:4326063] alloc with Identifier:1 
Demo[40891:4326063] alloc with Identifier:32 
Demo[40891:4326063] alloc with Identifier:1 
Demo[40891:4326063] alloc with Identifier:4 
Demo[40891:4326063] alloc with Identifier:32 
Demo[40891:4326063] alloc with Identifier:4 
Demo[40891:4326063] alloc with Identifier:32 
Demo[40891:4326063] alloc with Identifier:4 
Demo[40891:4326063] alloc with Identifier:32 
Demo[40891:4326063] alloc with Identifier:4 
Demo[40891:4326063] alloc with Identifier:32 
Demo[40891:4326063] alloc with Identifier:4 
Demo[40891:4326063] alloc with Identifier:32 
Demo[40891:4326063] alloc with Identifier:4 
Demo[40891:4326063] alloc with Identifier:32 
Demo[40891:4326063] alloc with Identifier:4 
Demo[40891:4326063] alloc with Identifier:32 
Demo[40891:4326063] alloc with Identifier:4 

Похоже, что «dequeueReusableCellWithIdentifier» returns nil иногда даже если клетка с тот же Идентификатор уже создан. Почему это?

после того, как удалить

[cell SetCellWithReuseIdentifier:reusestr andCellData:tempcelldata]; 

Это, кажется, лучше, вот информация для печати:

...... 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 1 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 1 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 1 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 1 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 1 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 1 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 1 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 1 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 1 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 2 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 5 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 1 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 1 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 5 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 2 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 1 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 5 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 2 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 1 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 1 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 4 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 32 
Demo[40999:4371081] dequeueReusableCellWithIdentifier : 2 
...... 

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

+0

ylongwu: Не очень уверен, пожалуйста, вы можете удалить [сотовый SetCellWithReuseIdentifier: reusestr andCellData: tempcelldata]; в ячейке для строки по пути индекса и снова проверить результат :) Это утверждение не имеет большого смысла :) –

ответ

1

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

0

Сначала Вы должны зарегистрировать это Tableview ячейки в методе viewdidload как это:

[YOURTABLEVIEW registerNib:[UINib nibWithNibName:@"YOURTABLEVIEWCELL" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"TABLEVIEW CELL IDENTIFIER"]; 

Надеется, что это поможет вам :)

+0

Я думаю, что точка OP заключается в том, что они пытаются проверить способ создания ячеек с учетом разных идентификаторов повторного использования. – Paulw11

3

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

0

здесь меняются dequeueReusableCellWithIdentifier каждый раз

дать имя идентификатора, который вы данное от stroybord и использовать их

static NSString *cellIdentifier = @"cellidentifier"; 
ChatTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
+0

Я думаю, что это был OP point - они пытаются проверить способ создания ячеек с учетом различных идентификаторов повторного использования. – Paulw11

+0

Он дает различный идентификатор ячейкам на основе свойства его модельного объекта, который имеет смысл. – MrTJ

2

Попробуйте следующий код в ваш метод

UITableViewCell * ячейка = [ tableView dequeueReusableCellWithIdentifier: @ "MyIdentifier"];

/* 
* If the cell is nil it means no cell was available for reuse and that we should 
* create a new one. 
*/ 
if (cell == nil) { 

    /* 
    * Actually create a new cell (with an identifier so that it can be dequeued). 
    */ 

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"] autorelease]; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

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