【问题标题】:Failed to obtain a cell from its DataSource无法从其 DataSource 获取单元格
【发布时间】:2016-03-18 23:07:22
【问题描述】:

下面的代码有什么问题

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

    NSString *CellIdentifier  = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    cell.textLabel.text = @"hello";

    return cell;
}

还有

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 2;
}

但我无法从其数据源获取单元格

整个异常是

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView (<UITableView: 0x7ffe0b092800; frame = (0 97; 414 590); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7ffe0acf3b10>; layer = <CALayer: 0x7ffe0aceb6e0>; contentOffset: {0, 0}; contentSize: {414, 88}>) failed to obtain a cell from its dataSource (<AllContactsViewController: 0x7ffe0ace60f0>)'

我已经为表格视图设置了委托和数据源

【问题讨论】:

  • 您是否注册了该重用标识符(在您的故事板中?)。如果不是,那么dequeueReusableCellWithIdentifier 可能会返回 nil,那么您有责任分配一个新单元格并返回该单元格

标签: ios objective-c uitableview


【解决方案1】:

我知道这个问题已经很老了,但就我而言,问题在于该单元格不是目标成员的一部分。

所以我所做的修复是将其包含在目标成员中。

【讨论】:

    【解决方案2】:

    您必须重写“cellForRowAt”方法。如果你没有这样做,请小心

    【讨论】:

      【解决方案3】:

      迁移时要小心
      如果有人将他们的代码从较旧的 swift 版本迁移到较新的版本,如果您无意中没有将 UITableViewDataSource 函数的语法更改为较新的 swift 语法,则可能会发生这种情况。
      不幸的是,编译器不会抱怨它。
      当我将代码从 swift 2 迁移到 swift 4 时,我遇到了这个问题。我没有更改 cellForRow DataSource 方法语法:

      func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell   
      

      到它的 swift 4 版本:

      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell  
      

      我得到了错误:

      "Failed to obtain a cell from its DataSource"
      

      【讨论】:

      • 节省我的时间兄弟(Y)很好的发现。
      【解决方案4】:

      就我而言,我忘了从动态原型更改为静态单元格,请在界面生成器中检查这部分

      【讨论】:

        【解决方案5】:

        确保您没有忘记实现 UITableViewDelegate 和 UITableViewDataSource 协议。

        class ExampleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

        【讨论】:

          【解决方案6】:

          检查是否添加了 UITableViewDataSource。我错过了这个,所以那个应用程序崩溃了

          【讨论】:

            【解决方案7】:

            在我的例子中,我忘记为 UITableview 声明 UITableViewDataSource、UITableViewDelegate。

            【讨论】:

              【解决方案8】:

              斯威夫特 3.0

              您只需要添加 UITableViewDelegateUITableViewDataSource

              import UIKit
              
              class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
              

              下图仅供参考。

              【讨论】:

              • 图片仅供参考,从上面复制UITableViewDelegate,UITableViewDataSource用粗体:)
              • 奇怪,我一直习惯通过 IBOutlet 连接 UITableView 委托/数据源,它曾经工作正常。不管怎样,谢谢你
              • @anoop4real 添加委托/数据源没问题,但是没有这一步就不行,因为它正在添加协议
              • @TheLastSummer 谢谢你的回答,但我的个人资料仍然没有影响。
              【解决方案9】:

              我遇到了同样的问题,这是因为我忘记实现 UITableViewDataSource 和 UITableViewDelegate 协议

              只需将它们添加到继承类之后的类声明中

              xcode 必须警告我,因为我在代码中使用了 UITableViewDataSource 和 UITableViewDelegate 方法

              【讨论】:

                【解决方案10】:

                在完成其他帖子中建议的步骤并检查我的单元格是否为 nil 后,我的问题没有解决,当我检查时我的单元格 not 显示为 nil。但是,在其中添加这个方便的代码 sn-p 确实解决了这个问题,所以在我没有抓住它的某个时候它一定是 nil 。

                if (cell == nil)
                {
                    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ClassNameOfMyCustomCell" owner:self options:nil];
                    cell = [nib objectAtIndex:0];
                }
                

                【讨论】:

                  【解决方案11】:

                  使用 Swift 3 时我忘记将 UITableViewDataSource 和 UITableViewDelegate 协议添加到 ViewController 声明时遇到此错误。

                  类 DataViewController:UIViewController、UITableViewDataSourceUITableViewDelegate

                  添加它们可以解决问题。

                  【讨论】:

                  • 似乎是 Swift 3 中的一个错误?
                  • 好吧,我不确定 Apple 是否会将此称为“错误”或“功能”。在验证了 David Reidy 描述的行为之后,我提交了一个错误,29314493。我说它应该“在没有协议声明的情况下工作”(这是我在 Objective-C 中所期望的),或者可能是因为 Swift 应该更麻烦的是,一个异常表明“UITableView 的数据源没有声明自己符合UITableViewDataSource”,而不是这个问题中描述的非常具有误导性的异常。
                  • Objective C 相同
                  • 此外,如果您不添加协议一致性,tableview 会正常调用 numberOfRowsInSection,但在调用 cellForRowAt indexPath 之前会崩溃。可悲的是没有任何逻辑
                  【解决方案12】:

                  当使用除了 UITableView 之外的 tableViewCell 时,你必须注册 自己的NIB。当 NIB 未注册时,可能会出现“无法从其数据源获取单元格”错误。 从错误描述中我总是很难弄清楚到底是哪里出了问题。

                  这个错误可以通过注册轻松解决:

                   [self registerNib:[customerButtonTableViewCell class]
                       forCellReuseIdentifier:customerButtonCellIdentifier forTableView:tableView];
                  

                  【讨论】:

                    【解决方案13】:

                    如果你没有加载 Nib,那么你必须先在 viewDidLoad 中注册 Nib。

                     [self.tableView registerNib:[UINib nibWithNibName:@"RecruitmentDetailViewC" bundle:nil] forCellReuseIdentifier:@"RecruitmentDetailViewC"];
                    

                    【讨论】:

                      【解决方案14】:

                      您的错误表明cellForRowAtIndexPath 出于某种原因返回nil,我猜这是因为您未能使可重复使用的单元格出列。如果您想确认这一点,只需在当前的 dequeue 调用之后设置一个断点:我希望您会发现 cell 设置为 nil

                      如果您使用的是现代 Xcode 模板,您可以在其中获得为您制作的原型单元,那么您可能应该改用这个:

                      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
                      

                      如果您没有使用 Xcode 模板,请使用该行代码,然后像这样注册您自己的重用标识符:

                      [self.tableView registerClass:[UITableViewCell self] forCellReuseIdentifier:@"Cell"];
                      

                      一切安好应该可以解决问题。 I wrote this up in more detail for Swift users.

                      【讨论】:

                      • 好吧,我现在的 ios 太差了。注册的事情奏效了。我正在使用最新的 xcode,但教程很旧。我想我需要了解更多,因为我不知道这个注册的东西是从哪里来的。因此,如果我们不使用原型单元格,我们需要注册 tableVIew 对象以便使用它。对吗?
                      • 每个人一开始都不好;你正在尝试、提问和学习——干得好!我自己的 iOS 教程是最新的,so you might want to try them。回答您的问题:您不注册表格视图对象,而是注册要使用的单元格类型。这样,当 table view 试图拉出一个时,它就知道你的意思了。
                      • 知道了。但是你的教程很快,我需要 Objective C。
                      • 是的,你的仪式。我在视图控制器中使用了多个 tableview,但我忘了返回一个 Cell。谢谢...,
                      【解决方案15】:

                      可能您没有使用在主故事板中为原型单元提供的相同标识符。尝试说出大写小写的名称,以确保您使用的是正确的标识符。

                      祝你好运:)

                      【讨论】:

                        【解决方案16】:

                        也请试试下面的代码

                         - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
                         {
                            static NSString *CellIdentifier = @"Cell";
                            // Reuse and create cell    
                            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
                            if (cell == nil) {
                                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
                            }
                            // Update cell data contents
                            cell.textLabel.text = @"Your text here";
                            cell.detailTextLabel.text=@"Your detailed text label";
                        
                            return cell;
                        }
                        

                        【讨论】:

                          【解决方案17】:

                          你必须给单元格一个标识符。 “单元格”赋予单元格的标识符,就像在标识符字段中单元格的属性检查器中一样。 我重新生成了您的错误,这是由于您没有为您的单元格提供标识符。

                          【讨论】:

                          • 我在视图控制器上使用了表格视图。单击表格视图时,我在属性检查器中看不到任何标识符字段。可能是因为我没有在表格视图中使用单元格?
                          • 在 tableView 中,您必须选择动态原型并通过增加其下方的计数来创建一个单元格。然后将添加一个单元格。您可以选择任何预定义或自定义的单元格类型。在此单元格中,您必须在单元格的属性检查器中提供单元格标识符。
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2015-09-02
                          • 2017-09-03
                          • 1970-01-01
                          • 2020-01-10
                          • 1970-01-01
                          相关资源
                          最近更新 更多