我有2个tableViews,第一个只从数组中加载一个列表。 另一个,每行显示详细信息。但它显示了崩溃报告:
'UITableView dataSource必须从tableView返回一个单元格:cellForRowAtIndexPath:Exception'
我的代码似乎有什么问题?我想向每一行显示来自同一sqlite行的不同细节。
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell;
//tableView 1
if(tableView == self.cTableLabel)
{
cell = [tableView dequeueReusableCellWithIdentifier:@"courseCell"];
NSLog(@"Here.");
Course *courses = [self.course objectAtIndex:indexPath.row];
cell.textLabel.text =courses.cName;
cell.detailTextLabel.text =courses.cSchool;
return cell;
}
//tableView 2
if(tableView == self.jTableLabel)
{
if (indexPath.row == 0)
{
cell = [tableView dequeueReusableCellWithIdentifier:@"JobName"];
cell.textLabel.text = _jDetails.jName;
}
else if (indexPath.row == 1)
{
cell= [tableView dequeueReusableCellWithIdentifier:@"JobEarnings"];
cell.textLabel.text = @"Job Earnings (per month): Php";
cell.detailTextLabel.text = _jDetails.jEarnings;
}
return cell;
}
return 0;
}
答案 0 :(得分:0)
首先,检查您的numberOfRowsInSection
是否返回了表格的正确行数。我认为这就是它。
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if(tableView == self.cTableLabel)
{
return [self.course count];
}
//tableView 2
if(tableView == self.jTableLabel)
{
return 2;
}
return 0;
}
否则我会在return 0;
之前的cellForRowAtIndexPath
或NSLog上设置一个断点,因为我的猜测既不是块被击中而你返回零。会被触发吗?
编辑 - 啊,我想如果你还没有设置一个,我会看到dequeueReusableCellWithIdentifier:
会返回一个空单元格。请尝试使用dequeueReusableCellWithIdentifier: forIndexPath:
。假设您先调用registerClass:[UITableViewCell class] forCellReuseIdentifier:
,这将始终返回一个有效的单元格。
试一试:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell;
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"courseCell"];
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"JobName"];
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"JobEarnings"];
//tableView 1
if(tableView == self.cTableLabel)
{
cell = [tableView dequeueReusableCellWithIdentifier:@"courseCell" forIndexPath:indexPath];
NSLog(@"Here.");
Course *courses = [self.course objectAtIndex:indexPath.row];
cell.textLabel.text =courses.cName;
cell.detailTextLabel.text =courses.cSchool;
return cell;
}
//tableView 2
if(tableView == self.jTableLabel)
{
if (indexPath.row == 0)
{
cell = [tableView dequeueReusableCellWithIdentifier:@"JobName" forIndexPath:indexPath];
cell.textLabel.text = _jDetails.jName;
}
else if (indexPath.row == 1)
{
cell= [tableView dequeueReusableCellWithIdentifier:@"JobEarnings" forIndexPath:indexPath];
cell.textLabel.text = @"Job Earnings (per month): Php";
cell.detailTextLabel.text = _jDetails.jEarnings;
}
return cell;
}
return 0;
}
也可以在你的init中调用registerClass:[UITableViewCell class] forCellReuseIdentifier:
,它只需要声明一次。
答案 1 :(得分:0)
出于性能原因,表视图的数据源通常应该在其tableView:cellForRowAtIndexPath:
方法中将行分配给行时重用UITableViewCell对象。表视图维护数据源已标记为可重用的UITableViewCell对象的队列或列表。当要求为表视图提供新单元格时,请从数据源对象中调用此方法。如果现有单元格可用,则此方法会使现有单元格出列,或者使用先前注册的类或nib文件创建新单元格。如果没有单元可供重用,并且您没有注册类或nib文件,则此方法返回nil。
如果您为指定的标识符注册了类,并且必须创建新的单元格,则此方法通过调用其initWithStyle:reuseIdentifier:
方法来初始化该单元格。对于基于nib的单元格,此方法从提供的nib文件加载单元格对象。如果现有单元可用于重用,则此方法将调用单元的prepareForReuse方法。
答案 2 :(得分:0)
您需要为每个tableview创建不同的单元格,尝试使用上面的代码:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell;
//tableView 1
if(tableView == self.cTableLabel)
{
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
else
{
for(UIView *view in cell.contentView.subviews)
{
[view removeFromSuperview];
}
}
NSLog(@"Here.");
Course *courses = [self.course objectAtIndex:indexPath.row];
cell.textLabel.text =courses.cName;
cell.detailTextLabel.text =courses.cSchool;
return cell;
}
//tableView 2
if(tableView == self.jTableLabel)
{
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
else
{
for(UIView *view in cell.contentView.subviews)
{
[view removeFromSuperview];
}
}
if (indexPath.row == 0)
{
cell = [tableView dequeueReusableCellWithIdentifier:@"JobName"];
cell.textLabel.text = _jDetails.jName;
}
else if (indexPath.row == 1)
{
cell= [tableView dequeueReusableCellWithIdentifier:@"JobEarnings"];
cell.textLabel.text = @"Job Earnings (per month): Php";
cell.detailTextLabel.text = _jDetails.jEarnings;
}
return cell;
}
return 0;
}
答案 3 :(得分:0)
请交叉检查您的某个表是否在numberOfRowsInSection方法中返回更多行数。可能是您没有检查此方法,因为两个表都返回不同的行数。