UITableView" cellForRowAtIndexPath"不工作

时间:2015-12-23 13:38:07

标签: ios objective-c iphone uitableview cocoa-touch

我试图使用" reloadData" uitableView上的方法,它似乎有效(正在调用dataSource方法),当我调试" cellForRowAtIndexPath"它返回的单元格是正确的单元格)但是我看不到单元格(numberOfRowsInSection正在改变并为每个新单元格添加空格 - 所以它似乎不是线程问题)。例如,如果我有tableView 5"名称" (我的数据数组名为" namesArray")我添加2将在tableView上显示5个名称和2个无细胞。问题似乎是cellForRowAtIndexPath

cellForRowAtIndex:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//Creating "cellIdentifier"(NSString) with "Cell" as the value
NSString *cellIdentifier=@"Cell";

[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];

//Creating a default cell using "cellIdentifier"(NSString)
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
if (cell==nil) {
    cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}

cell.textLabel.text=[namesArray objectAtIndex:indexPath.row];

//Returning cell
return cell;
}

numberOfRowsInSection:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.namesArray.count;
}
-(void)addNameToNamesArray:(NSString*)name
 {
     [self.namesArray addObject:name];
     NSLog(@"namesArray lastObject: %@",[self.namesArray lastObject]);
    //NSLog print: The correct name (the one that was added)

    [self.tableView reloadData];
 }

屏幕截图" 5个名字和2个无细胞": screenshot 你知道它能成为什么吗?

5 个答案:

答案 0 :(得分:0)

这可能是因为您更新了数组中的数据,但表视图尚未访问该数据,从而导致您看到的nil单元格。由于您的单元格正确加载了数组中的初始5元素,因此您可能根本没有刷新表格视图的数据。尝试使用[tableView reloadData] 之后将新元素添加到数组中。

编辑1 如何将cellForRowAtIndexPath代码更改为:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //Creating "cellIdentifier"(NSString) with "Cell" as the value
     NSString *cellIdentifier=@"Cell";

    //Creating a default cell using "cellIdentifier"(NSString)
     UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

     cell.textLabel.text = [self.namesArray objectAtIndex:indexPath.row];
     NSLog(@"name: %@", cell.textLabel.text);

    //Returning cell
     return cell;
}

告诉我们NSLog的输出。

答案 1 :(得分:0)

更改为

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//Creating "cellIdentifier"(NSString) with "Cell" as the value
static NSString *cellIdentifier=@"Cell";

//[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];

//Creating a default cell using "cellIdentifier"(NSString)
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell==nil) {
    cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}

cell.textLabel.text=[namesArray objectAtIndex:indexPath.row];

//Returning cell
return cell;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.namesArray.count;
}

设置tableview的出口,然后在addNameToNamesArray方法中添加元素后重新加载tableview

答案 2 :(得分:0)

你打电话

[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];

在cellForRowAtIndexPath里面!

你不觉得这有点晚了吗?如果它有效,你会经常调用它吗?

如果出列了......当一个类注册时返回nil,就会出现严重错误。

答案 3 :(得分:0)

1.确保您已在self.namesArray

中初始化viewDidLoad

尝试以下方法:

[tableView registerClass:[UITableViewCell class]forCellReuseIdentifier:cellIdentifier];

如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }

    cell.textLabel.text = [namesArray objectAtIndex:indexPath.row];

    return cell;
 }

答案 4 :(得分:0)

你的代码完全没问题。可能有一些可能性不适合你。

  1. 您没有初始化您的数据源,即您的情况下的NSMutableArray。
  2. 这取决于你如何调用addNameToNamesArray方法。
  3. 如果您可以分享该类的整个代码,就像您调用方法以及您正在使用的每个代表一样。