未调用UITableView方法cellForRowAtIndexPath

时间:2014-07-11 12:56:15

标签: uitableview swift

我的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可能存在问题!

编辑:该方法无法调用。

14 个答案:

答案 0 :(得分:41)

知道了!

有同样的问题 - 我还在uiviewcontroller中添加了一个tableview,它也没有用,但我现在知道这个问题了。

如果在界面构建器上添加tableview并在“Add Missing Constraints”之后单击,则会添加无法一起使用的约束。

在我的位置,我在整个uiview上都有了tableview,点击“添加缺失约束”后,它会在这里添加:

enter image description here

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

希望我能帮助你。

答案 1 :(得分:11)

您需要实现此功能,否则永远不会调用cellForRowAtIndexPath

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

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

答案 2 :(得分:1)

似乎没有解决方案。返回xCode 6 beta 2修复了这个问题。希望并且可能会在Beta 4中修补。

答案 3 :(得分:1)

可能会对你有帮助。

我有以下内容:

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

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

即使当我设置self.myTableView.rowHeight = 59(或59或58),如果我在heightForHeaderInSection返回一个值> = 60所述的cellForRowAtIndexPath不叫

因此,我在函数heightForHeaderInSection中返回一个值< = 59,然后调用cellForRowAtIndexPath。 (使用cellForRowAtIndexPath中的断点来检查)。

另一个问题:如果调用了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行。

答案 4 :(得分:1)

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

我的解决方案是

  1. 创建新的UITableViewController
  2. 仅复制UITableViewCell
  3. 清除所有约束(不确定你是否需要这个,但对我来说这很糟糕)
  4. 在我的情况下,“添加缺失的约束”和“重置为建议约束”很麻烦所以我手动添加它。
  5. 与数据源btw没什么关系,你可以简单地将一些foo内容添加到单元格中的某个标签上以分离问题。

    HTH

答案 5 :(得分:1)

也许您已在 init

中声明了委托
preg_quote()

}

应该在 ViewDidload

中调用它
-(instancetype)init{
self = [super init];
if(self){
    _tableView.delegate = self;
    ,...
    }
return self;

,... }

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

当我将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没有被添加到任何视图中,它被添加但后来被另一个视图替换,因此从未调用过数据源方法。希望它可以帮到某人。

答案 8 :(得分:0)

override func tableView(_ tableView: UITableView!,
cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { }

我缺少下划线作为第一个参数tableView。

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

答案 9 :(得分:0)

检查是否有以下几行:

tableView.delegate = self
tableView.dataSource = self

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

答案 10 :(得分:0)

确保您具有UITableView对象的设置委托和数据源属性。

答案 11 :(得分:0)

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

tableView.setEditing(true, animated: true)

答案 12 :(得分:-1)

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

答案 13 :(得分:-3)

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

<强>解决方案:

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

  • 当我的回复来自网络服务时,由于网络阻止响应是黑色的,因此未调用cellForRowIndexPath方法。