UITableView方法cellForRowAtIndexPath未被调用。

23

我的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 beta3,但是这段代码在beta2中运行得非常好。

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

编辑:我查看了其他Swift项目,其中有相同的函数,两周前它可以工作,但现在它也不能工作。也许这是一个Xcode6 beta 3的问题?

我的类的类型为UITableViewController

编辑:我正在查看苹果开发者论坛,并看到了与更新到XCode 6 beta 3相关的问题,所以很可能是XCode 6 beta 3的问题!

编辑:该方法未被调用。


你是否已经在你的表视图中注册了你的单元格标识符? - Kreiri
是的,我已经注册了我的手机标识符。 - Bas
17个回答

61

明白了!

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

如果你在界面生成器中添加tableview,然后点击“添加丢失的约束条件”,它会添加不能一起使用的约束条件。

在我的位置上,我已经将tableview放在整个uiview上,然后在点击“添加丢失的约束条件”之后,它会添加这个:

enter image description here

如果你删除其中一个Trailing或Leading对齐,它就能工作了 - cellForRowatindexPath将被调用!不知道为什么是这样,但它会运行。

希望我能帮到你。


1
大家好,Xcode 6.1 beta 版本已经修复了这个问题 - 只需删除约束并重试“添加缺失的约束”即可解决问题! - kurtanamo
在更改了一些TableView的约束条件后,它对我起作用了。 - Zin Win Htet
1
添加缺失的约束条件,在我的情况下有所帮助。谢谢。 - Amit Khetan
在以编程方式将UITableView添加到UIViewController时,我遇到了相同的问题。我通过将tableView设置为当前视图控制器的视图来解决它,代码如下:self.view = tableView(这将为tableView设置约束)。 - Yulia
这对我也起作用了,谢谢。10年后,哇,感谢苹果让我浪费了最后一个小时,直到我找到了这个SO帖子。 - Nick M

12
你需要实现这个方法,否则cellForRowAtIndexPath将永远不会被调用:
override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
  // Return the count of the number of rows in the table
  return 5
}
< p > 这里的 5 只是一个例子。你需要返回数组中元素的数量。


不好意思,那就是问题所在,我忘记更新我的问题了。 - Bas
3
展示如何设置tableView.dataSource。在我的 Swift 项目中,我在 UITableViewController 子类的 viewDidLoad() 方法中设置了 tableView.dataSource = self - vacawama
我使用连接检查器将数据源连接上了。 - Bas
尝试在代码中设置并查看是否有帮助。如果它有效,它会告诉你在连接检查器中没有正确连接。如果它无效,你就知道要去其他地方找问题了。另外,numberOfRowsInSection是否被调用了? - vacawama
我尝试过了,但是遇到了同样的问题。并且调用了numberOfRowsInSection方法。 - Bas
在 beta 5 上出现了相同的问题。 - kurtanamo

6

检查一下是否有这些行:

tableView.delegate = self
tableView.dataSource = self

如果没有实现dataSource = self,可能会导致未调用cellForRowAt indexPath方法


1
也许你已经在 init 中声明了代理:
-(instancetype)init{
self = [super init];
if(self){
    _tableView.delegate = self;
    ,...
    }
return self;

}

应该在 ViewDidLoad 中调用它:
- (void)viewDidLoad {
[super viewDidLoad];
_tableView.delegate = self;

,... }


1
也许这能帮到你。
我有以下内容:
在函数heightForHeaderInSection中,self.myTableView.rowHeight = 60,返回60。
cellForRowAtIndexPath没有被调用。
如果在heightForHeaderInSection中返回值>=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是行高(self.myTableView.rowHeight = 60),而50是函数heightForHeaderInSection返回的值。这样可以显示tableView行。

1
我有同样的问题,奇怪的是调用了"Numbers of Rows"方法,但"cellForRowAt"方法没有被调用。在我的情况下,这都是由于故事板的约束条件造成的,请确保tableview没有被隐藏并且已经安装在故事板上。

1

看起来目前还没有解决方案。回到 xCode 6 beta 2 可以解决问题。希望并很可能在 Beta 4 中得到修复。


1
XCode版本6.3.1(6D1002),我遇到了这个问题,在我的情况下,我复制了UITableViewController并在其他地方重用它导致了这个问题。
我的解决方案是:
  1. 创建新的UITableViewController
  2. 仅复制UITableViewCell
  3. 清除所有约束(不确定你是否需要,但对我来说很混乱)
  4. 在我的情况下,“添加缺失的约束”和“重置为建议的约束”会出现问题,所以我手动添加。
顺便说一句,与数据源无关,您只需将一些foo内容添加到单元格中的某个标签中即可分离问题。
希望有帮助。

0
你需要在 viewDidLoad 中将 tableview 设置为编辑模式。
tableView.setEditing(true, animated: true)

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

我在tableView作为第一个参数的时候漏掉了下划线。

可能还需要添加override关键字。如果override正常工作,那么你就知道已经正确地描述了这个函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接