Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c dequeueReusableCellWithIdentifier始终返回nil(不使用情节提要)_Objective C_Ios_Uitableview_Deque - Fatal编程技术网

Objective c dequeueReusableCellWithIdentifier始终返回nil(不使用情节提要)

Objective c dequeueReusableCellWithIdentifier始终返回nil(不使用情节提要),objective-c,ios,uitableview,deque,Objective C,Ios,Uitableview,Deque,我使用重用标识符以编程方式创建单元格 注意-我没有使用故事板创建单元格 每当单元出列时,单元都是nil,因此需要使用alloc新创建单元,这非常昂贵 编辑(增加1个问题和更正代码) 问题 为什么这个出列总是返回零?我怎样才能纠正它 仅当与故事板/nib文件一起使用时,出列才起作用吗 代码 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

我使用重用标识符以编程方式创建单元格

注意-我没有使用故事板创建单元格

每当单元出列时,单元都是nil,因此需要使用alloc新创建单元,这非常昂贵

编辑(增加1个问题和更正代码)

问题

  • 为什么这个出列总是返回零?我怎样才能纠正它
  • 仅当与故事板/nib文件一起使用时,出列才起作用吗
代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(!cell) //Every time cell is nil, dequeue not working 
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    }

    return cell;
}

您需要首先将
单元标识符设置为
单元
。你在这么做吗?创建新单元格时,需要将此标识符
单元格
分配给它。只有这样,iOS才能使用该标识符将ReuseAbleAbleCellWithIdentifier退出队列。在程序上,你可以这样做-

UITableViewCell *cell = [[UItableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"Cell"];
您也可以从Interface Builder中设置标识符-


此代码应生成警告“控件到达非无效函数的末尾”,因为您实际上没有返回任何内容。添加
返回单元格到函数末尾。此外,决不会将重用标识符添加到新创建的单元格中

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

我犯了几个错误:

  • 我使用了
    UITableViewController
    的子类,但在子类之外创建了tableView
  • 在表视图控制器中创建了一个
    tableView
    ,它是tableView控制器中的
    self.tableView
    ,当返回索引路径的单元格时,我使用的是
    self.tableView
    而不是
    tableView
  • 另外,确保单元标识符声明为
    静态

    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    

  • 由于
    tableView
    self.tableView
    表示不同的表,因此单元格没有从同一个表中排队,因此总是
    nil
    首先在viewDidLoad方法中声明tableViewCell的单元格标识符,如下所示:

    [tableView registerClass:UITableViewCell.class forCellReuseIdentifier:@"MyCell"];
    
    现在回想一下UITableViewCell的实例,其标识符与“MyCell”相同,如下所示:

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell" forIndexPath:indexPath];
    
    再往前走,把电池加满。。现在,逻辑执行有限数量的单元能够高效地显示巨大的列表(使用出列概念)


    但请记住为单元格中使用的每个UIView赋值(如果需要,甚至为零),否则会发生文本/图像的覆盖/重叠。

    它返回零的频率到底有多高?这些单元中有多少同时显示在您的设备屏幕上?重用意味着只重用那些刚刚从屏幕上滚下来的单元格。Srikar是对的。必须在新创建的单元格上设置相应的单元格标识符。它始终返回nil。在给定的时间显示4个单元格,当我滚动“出列”时返回“零”。我没有使用情节提要,而是通过编程创建单元格。所以我认为这个解决方案可能不适用。如果我错了,请纠正我嘿,伙计,我为两者都提供了解决方案。请仔细阅读答案。首先,我给出了编程解决方案,然后为了完整起见,我也提供了IB解决方案。很抱歉,NSString CellIdentifier设置为@“Cell”。注意,原始代码现在已经更新。我正在这样做,它出现在我粘贴的代码中。如果我遗漏了什么,你能告诉我吗。在粘贴代码时,我漏掉了几行,现在我已经编辑和更新了。您粘贴的代码就是我正在使用的代码。但它每次都返回零。为了完全消除歧义,我在
    nib
    中将
    tableView
    命名为
    mTableView