Swift 3.0 和 Xcode 8 迁移后未调用 UITableViewDelegate 方法

Posted

技术标签:

【中文标题】Swift 3.0 和 Xcode 8 迁移后未调用 UITableViewDelegate 方法【英文标题】:UITableViewDelegate methods not called after Swift 3.0 and Xcode 8 migration 【发布时间】:2016-10-16 11:54:17 【问题描述】:

将我的代码库从 Swift 2.2 迁移到 Swift 3.0 后,我注意到我的 UITableView 页脚没有出现。事实证明,我的 UITableViewDelegate 方法都没有被调用(例如:func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?)。

有趣的是,UITableViewDataSource 方法正在被调用并且表格正在被填充。我已将父视图控制器设置为表的delegatedataSource

为了说明这个问题,我创建了一个sample Swift 3.0 project,以尽可能匹配我现有的代码库。也许 Swift 3/Xcode 8 中发生了一些我不知道的变化,或者我可能遗漏了一些非常明显的东西。感谢您的帮助!

【问题讨论】:

【参考方案1】:

在我检查了您的示例项目之后:

你没有做错什么,但是参考viewForFooterInSection,直到你实现heightForFooterInSection方法才会被调用:

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat 
    return 50 // for example

类似案例:

heightForHeaderInSection 没有实现 ==> 没有调用 viewForHeaderInSection,即使它已经实现。

numberOfRowsInSection 返回为零 ==> 即使已实现,也不会调用 cellForRowAt

补充说明:tableView.dataSource = selftableView.delegate = self不必在viewDidLoad()中添加,它们已经在界面Builder中设置好了。

【讨论】:

明白了!我很惊讶它以前没有明确设置页脚高度就可以工作。也许新的默认高度为零。【参考方案2】:

你应该设置页脚的高度

 func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat 
    return 15

【讨论】:

感谢@Rroobb 的帮助! 很高兴为您提供帮助。【参考方案3】:

在 Xcode8 或最新的 Swift 版本中,方法签名已更改。此更改可能会导致您的代码不调用委托方法。

通过使用自动完成再次编写方法来修复它。

旧方法 -

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat? 
    return 50.0

新方法-

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 
    return 50.0

heightForHeaderInSection 必须在使用 viewForHeaderInSection 时使用。

希望这会有所帮助。

【讨论】:

以上是关于Swift 3.0 和 Xcode 8 迁移后未调用 UITableViewDelegate 方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Xcode 8 和 Swift 3.0 中删除覆盖后准备 segue 崩溃

自定义幻灯片 Segue - Xcode 8.0 Swift 3.0

在 Xcode 8.0 Swift 3.0 上检测手势

Apple Mach-O 链接器 (ld) 错误 swift 3.0 和 Xcode 8.3.3

iOS 10 / Swift 3.0 / XCode 8 总结

打印可变展开 Segue - Xcode 8.0 Swift 3.0