未调用 UITableView 方法 cellForRowAtIndexPath

Posted

技术标签:

【中文标题】未调用 UITableView 方法 cellForRowAtIndexPath【英文标题】:UITableView method cellForRowAtIndexPath not called 【发布时间】:2014-07-11 12:56:14 【问题描述】:

我的UITableView 没有显示任何数据。我认为问题出在:

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell?`

这是我的代码:

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell? 
    // Configure the cell...
    let cellId: NSString = "Cell"
    var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(cellId) as UITableViewCell

    if let ip = indexPath 
        //var data: NSManagedObject = myList[ip.row] as NSManagedObject
        //cell.textLabel.text = data.valueForKey("name") as String
        cell.textLabel.text = "Hi"
    
    return cell

我在 youtube 上看到了使用此代码的教程,但我无法使用它。

首先我认为这是我的数组有问题,但是当我只是将文本放入其中时,它仍然没有显示任何内容。

我正在运行 Xcode6 beta 3,但这段代码在 beta 2 中运行得非常好。

我没有任何警告或错误消息。

编辑:我查找了我的其他一些 Swift 项目,在那里我得到了相同的功能,它在 2 周前工作,但现在它也不起作用.也许这是一个 Xcode6 beta 3 问题?

我的班级是UITableViewController

编辑:我浏览了 Apple 开发者论坛,并在更新到 xCode 6 beta 3 后看到了相关问题,所以这可能是 xCode 6 beta 3 的问题!

编辑:该方法没有被调用。

【问题讨论】:

您是否在表格视图中注册了单元格标识符? 是的,我已经注册了我的手机标识符 【参考方案1】:

知道了!

遇到了同样的问题 - 我还在 uiviewcontroller 中添加了一个 tableview,但它也没有工作,但我现在知道问题所在了。

如果您在界面生成器上添加 tableview 并在“添加缺少的约束”之后单击,它将添加不能一起工作的约束。

在我的位置上,我的整个 uiview 都有 tableview,点击“Add Missing Constraints”后,它会在此处添加:

现在,如果您删除尾随或前导对齐之一,它将起作用 - cellforrowatindexPath 将被调用!不知道为什么会这样,但它会起作用。

希望我能帮到你。

【讨论】:

大家好,它已在 Xcode 6.1 测试版上修复 - 只需删除约束并重试“添加缺失的约束” - 即可! 在更改了一些 TableView 约束后它对我有用。 添加缺少的约束,对我有帮助。谢谢。 以编程方式添加到 UIViewController 的 UITableView 有同样的问题。我已经解决了将 tableView 设置为当前视图控制器的视图,如下所示: self.view = tableView (这设置了 tableView 的约束)。【参考方案2】:

你需要实现这个,否则cellForRowAtIndexPath将永远不会被调用:

override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int 
  // Return the count of the number of rows in the table
  return 5

5 当然只是一个例子。您将返回数组中元素数量的计数。

【讨论】:

不,这就是问题所在,对不起,我忘记更新我的问题了。 展示你如何设置你的tableView.dataSource。在我的 Swift 项目中,我在 viewDidLoad()UITableViewController 子类中设置了 tableView.dataSource = self 我用连接检查器连接了数据源 尝试在代码中设置它,看看是否有帮助。如果它有效,它会告诉您在连接检查器中没有正确连接它。如果它不起作用,你就会知道去别处看看。另外,numberOfRowsInSection 被调用了吗? 我试过了,遇到了同样的问题。并且调用了 numberOfRowsInSection。【参考方案3】:

检查是否有这些行:

tableView.delegate = self
tableView.dataSource = self

如果dataSource = self 未实现,则可能是未调用cellForRowAt indexPath 方法的原因

【讨论】:

【参考方案4】:

似乎没有解决方案。返回到 xCode 6 beta 2 修复了该问题。希望并且很可能会在 Beta 4 中对其进行修补。

【讨论】:

【参考方案5】:

也许这会对你有所帮助。

我有以下几点:

self.myTableView.rowHeight = 60 在函数 heightForHeaderInSection 中:返回 60 未调用 cellForRowAtIndexPath

如果在 heightForHeaderInSection 中返回的值 >= 60,则不会调用 cellForRowAtIndexPath。

即使我设置 self.myTableView.rowHeight = 59(或 59 或 58),如果我在 heightForHeaderInSection 返回值 >= 60,也不会调用 cellForRowAtIndexPath。

因此,我在函数 heightForHeaderInSection 中返回一个值

另一个问题:如果调用了 cellForRowAtIndexPath 但您看不到 tableView 的行:这是因为 tableView 的高度太短。

例如: (在这种情况下,titulo_tabla 是我的表上方的 UILabel。aOrdenes 是一个 NSArray,我从中获取我显示的行数)。

var width = self.view.frame.size.width
var height = self.view.frame.size.height
... 
myTableView.frame = CGRectMake(width * 0.03, titulo_tabla.frame.origin.y + titulo_tabla.frame.height, width - 2 * (width * 0.03), 60.0 * CGFloat(aOrdenes.count) + 50)

在最后一个代码中,最后一个参数..., 60.0 * CGFloat(aOrdenes.count) + 50) 60 是 rowHeight (self.myTableView.rowHeight = 60) 而 50 是函数 heightForHeaderInSection 中返回的值.这样你的 tableView 行就会显示出来。

【讨论】:

【参考方案6】:

XCode 版本 6.3.1 (6D1002) 我刚刚遇到这个问题,在我的情况下,我复制 UITableViewController 并在某处重用它会导致这个问题。

我的解决办法是

    新建 UITableViewController 只复制 UITableViewCell 清除所有限制(不确定您是否需要这个,但对我来说它搞砸了) 在我的情况下,“添加缺少的约束”和“重置为建议约束”搞砸了,所以我手动添加它。

顺便说一句,与数据源无关,您可以简单地将一些 foo 内容添加到单元格中的某个标签以分隔问题。

HTH

【讨论】:

【参考方案7】:

也许你已经在 init 中声明了委托:

-(instancetype)init
self = [super init];
if(self)
    _tableView.delegate = self;
    ,...
    
return self;

应该在ViewDidload中调用它:

- (void)viewDidLoad 
[super viewDidLoad];
_tableView.delegate = self;

,...

【讨论】:

【参考方案8】:

您必须确保正确分配数据源并且使用正确的方法签名。你声明了一些选项错误。

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

【讨论】:

数据源已正确分配,并且使用您的方法签名,它仍然没有显示任何内容:( 方法是否被调用? 我放了一个断点,是的,该方法没有被调用足够奇怪,其他方法确实被调用了。 在主详细信息模板中以这种方式声明 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell - 另一个签名来自文档... 即使这样也不叫【参考方案9】:

当我将在 Xcode 8.2.1 中开发的旧 Swift 2.3 代码迁移到 Xcode 8.3 中的 Swift 3.0 时,我遇到了同样令人沮丧的问题,对我来说 numberOfRows 被调用了

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
   return 2

但永远不会调用主要的数据源方法,

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

主要问题是我通过 Swift 代码创建的 UITableView 没有添加到任何视图中,它被添加但后来被另一个视图替换,因此从未调用数据源方法。希望它可以帮助某人。

【讨论】:

【参考方案10】:
override func tableView(_ tableView: UITableView!,
cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!  

我在第一个参数 tableView 中缺少下划线。

它也可能需要覆盖。如果覆盖有效,您将知道您是否正确描述了函数。

【讨论】:

【参考方案11】:

您需要为表格视图设置高度约束。您可以在情节提要中设置或以编程方式设置。如果您需要,我将发布一个运行示例。

【讨论】:

【参考方案12】:

确保您已为 UITableView 对象设置委托和数据源属性。

【讨论】:

【参考方案13】:

您需要在viewDidLoad中设置tableview为编辑模式

tableView.setEditing(true, animated: true)

【讨论】:

【参考方案14】:

我在 UITableView 上也遇到了这个问题,我还设置了数据源并委托给表格视图,但是我的 cellForRowAtIndexPath 方法没有被调用。

解决方案:

我的网络阻止了我的方法(通过使用防火墙)。我询问了我的网络管理员,我获得了对网络的完全访问权限,然后我的 cellForRowIndexPath 方法被调用了。

当我的响应来自网络服务时,由于网络阻塞响应是黑色的,所以 cellForRowIndexPath 方法没有被调用。

【讨论】:

以上是关于未调用 UITableView 方法 cellForRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

未调用 UICollectionView 内部 UITableView 的委托方法

我正在尝试在按钮操作中调用 uitableview“editActionsForRowAt IndexPath”方法。编辑视图未显示

在 UITableView 单元格滑动中选择“删除”,但未调用“提交编辑样式”

Swift UITableView:数据源分配问题

UITableView 内容在滚动时合并?

滚动 UITableView 期间未调用 audioPlayerDidFinishPlaying