您好我尝试使用故事板使用4个原型单元格。对于每个原型单元格,我有一个带有我的标签的类uitableviewCell。
查看我的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"ProfilCell";
static NSString *CellIdentifier1 = @"ProfilCell1";
static NSString *CellIdentifier2 = @"ProfilCell2";
static NSString *CellIdentifier3 = @"ProfilCell3";
static NSString *CellIdentifier4 = @"ProfilCell4";
if(indexPath.section == 0)
{
ProfilCell* cell =(ProfilCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.pseudoLabel.text=[[infoArray objectAtIndex:indexPath.row]valueForKey:@"pseudo"];
return cell;
}
if(indexPath.section == 1)
{
ProfilCell2* cell = (ProfilCell2*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
cell.textLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"status"];
return cell;
}
if(indexPath.section == 2)
{
switch (indexPath.row)
{
case 0:
{
ProfilCell3* cell =(ProfilCell3*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
cell.ageLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"age"];
return cell;
}
break;
case 1:
{
ProfilCell4* cell = (ProfilCell4*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier3];
cell.deptLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"localite"];
return cell;
}
break;
case 2:
{
ProfilCell5* cell = (ProfilCell5*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier4];
cell.membreLab.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"membre"];
return cell;
}
break;
default:
break;
}
}
return nil;
}
在第0部分第1节中,我的标签中有数据,但在第2部分的情况下,我有这个:
[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
为什么我的数组似乎是空的
现在可以为indexPath提供0,因为我在数组中只有一个对象!!!
答案 0 :(得分:1)
你应该尝试这样的事情......
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"ProfilCell";
static NSString *CellIdentifier1 = @"ProfilCell1";
static NSString *CellIdentifier2 = @"ProfilCell2";
static NSString *CellIdentifier3 = @"ProfilCell3";
id cell = nil;
if(indexPath.section == 0) {
cell = (ProfilCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.pseudoLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"pseudo"];
}
if(indexPath.section == 1) {
cell = (ProfilCell2*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
cell.statusLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"status"];
}
if(indexPath.section == 2) {
cell =(ProfilCell3*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
cell.ageLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"age"];
}
if(indexPath.section == 3) {
cell = (ProfilCell4*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier3];
cell.deptLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"localite"];
}
return cell;
}
我在这里所做的是为id
类型的单元格设置一个var,这意味着它可以是任何东西。在if语句中,您决定使用哪个单元格,并相应地进行设置。最后只返回1个单元格实例,而不是每个语句。希望这有帮助
答案 1 :(得分:1)
您应该确认您对dequeueReusable的每次调用...实际上都返回了一个单元格。使用:
NSAssert (cell, @"Missed Cell");
在每个'if'语句的正文中。我怀疑是否有一个零细胞被归还。这是因为您的重用标识符“ProfilCell”,“ProfilCell1”,...与故事板中的单元标识符不一致。要修复它,请转到故事板,逐个选择每个原型单元格,确认“标识符”与代码中的内容一致。如果没有,请将其更改为同意。
'标识符'必须匹配;不是'标签'!
答案 2 :(得分:0)
检查ProfilCell,ProfilCell2,ProfilCell3和ProfilCell4是否都是UITableViewCell的子类
同时检查您的单元格标识符是否与故事板中的标识符匹配。
答案 3 :(得分:-2)
致电dequeueReusableCellWithIdentifier:
后,必须检查nil
的返回值。如果返回的值不是nil
,那么你没事;你从队列中得到了一个可重用的单元格。 但如果返回的值为nil
,则队列中没有可用的可重用单元格。 (对于新创建的表,情况总是如此。)在后一种情况下,您必须使用alloc
和init
以编程方式创建一个新单元格:
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"TableViewCell"] autorelease];
或从.xib文件加载:
cell = [[[NSBundle mainBundle] loadNibNamed:@"TableViewCell"
owner:self options:nil] lastObject];
在您的情况下,您可以尝试以下内容(对其他部分重复):
if (indexPath.section == 0)
{
ProfilCell *cell = (ProfilCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) // if we did not get a reusable cell from the queue, we make one…
{
cell = [[ProfilCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.pseudoLabel.text= [[infoArray objectAtIndex:indexPath.row]valueForKey:@"pseudo"];
return cell;
}