未调用 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”方法。编辑视图未显示