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
方法正在被调用并且表格正在被填充。我已将父视图控制器设置为表的delegate
和dataSource
。
为了说明这个问题,我创建了一个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 = self
和tableView.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
Apple Mach-O 链接器 (ld) 错误 swift 3.0 和 Xcode 8.3.3