2017-04-05 49 views
-1

我在Storyboard中添加了一个TableViewController,并将其类型更改为继承UITableViewController的自定义类。 我还在故事板中添加了一些单元格。 (不是自定义的,基本的UITableViewCells) 现在我想以编程方式修改这些单元格(如有条件地添加披露指示符)。所以,我做了我的班采取的UITableViewDelegate,但是当我尝试以编程方式修改我的单元格的文本,我得到这个错误:无法从其dataSource中获取单元格 - 故事板和代码

NSInternalInconsistencyException : failed to obtain a cell from its dataSource

下面是代码:

@interface MyTableViewController() <UITableViewDelegate> 
@end 

@implementation MyTableViewController 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    cell.textLabel.text = @"test"; 
    return cell; 
} 

@end 

在我的故事板,在引用出口,我正确地有dataSource和委托链接到表视图。 我在这里错过了什么?感谢您的帮助

+0

您正在调用'[tableView cellForRowAtIndexPath:indexPath]'?这不是要调用的方法。调用'UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@“someCellID”forIndexPath:indexPath];' – Larme

+0

对于您的表格视图内容,您使用的是动态原型还是静态单元格? –

+0

@Larme谢谢你的回复。我尝试在我的故事板中设置标识符“TestCell”,并用'dequeueReusableCellWithIdentifier'替换了'cellForRowAtIndexPath',但现在我得到这个错误:'无法使标识符TestCell出队 - 必须为标识符注册一个笔尖或类,连接故事板中的原型单元格 – Someday

回答

1

您应该使用-dequeueReusableCellWithIdentifier:代替[tableView cellForRowAtIndexPath:indexPath]; 但首先,如果你使用的是故事板或XIB你必须有设置reuseIdentifier和检查,如果你使用相同的reuseIdentifier在[tableView dequeueReusableCellWithIdentifier:@"<your cell id>"];,如果你不使用IB你应该[self.tableView registerClass:forCellReuseIdentifier:]

注册您的细胞,但要注意,有2种不同的方法

1. - (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;

2. - (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;

如果设置未注册reuseIdentifier在第一个,你会得到一个细胞== nill和第二你会得到的情况下崩溃 ,如果你得到它的零您可以创建和使用注册新的细胞:

if (cell == nil) 
    { 
     cell = [UITableViewCell initWithStyle:UITableViewCellStyleDefault reuseIdentifier:<your cell id>]; 
    } 
+0

我尝试了这一点,但即使我在IB中首先设置了我的标识符,我仍然无法使标识符TestCell出错。应用程序崩溃之前,它检查单元格== nil,它崩溃的第一行:'UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@“TestCell”forIndexPath:indexPath];' – Someday

+0

@Someday如果你打电话withiout'forIndexPath'的事情,你会没有崩溃......但仍然存在一个奇怪的行为,你是否在故事板或单独的.xib文件中创建单元格? –

+0

如果使用.xib,你必须注册它:#tableView registerNib:[UINib nibWithNibName:@“”bundle:nil] forCellWithReuseIdentifier:@“”] –

-1
static NSString *simpleTableIdentifier = @"TxtTableViewCell"; 
TxtTableViewCell *cell = (TxtTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 
if (cell == nil) { 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TxtTableViewCell" owner:self options:nil]; 
    cell = [nib objectAtIndex:0]; 
} 
相关问题