UITableViewDelegate methods not called after Swift

2019-02-25 12:38发布

After migrating my codebase from Swift 2.2 to Swift 3.0, I noticed that my UITableView footer did not show up. It turns out that none of my UITableViewDelegate methods get called (ex: func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?).

Interestingly, the UITableViewDataSource methods are being called and the table is being populated. I have set the parent view controller to be the table's delegate and dataSource.

To illustrate the problem, I have created a sample Swift 3.0 project tailored to match my existing codebase as much as possible. Maybe something changed in Swift 3/Xcode 8 that I am not aware of or I might be missing something really obvious. Thank you for your help!

3条回答
Root(大扎)
2楼-- · 2019-02-25 13:16

After I checked your sample project:

You didn't did anything wrong, but referring to viewForFooterInSection, it will not get called until you implement heightForFooterInSection method:

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

Similar Cases:

No implementing for heightForHeaderInSection ==> No calling for viewForHeaderInSection even if it's implemented.

Returning numberOfRowsInSection as zero ==> No calling for cellForRowAt even if it's implemented.

Additional Note: you don't have to add tableView.dataSource = self and tableView.delegate = self in viewDidLoad(), they have been set in the interface Builder.

查看更多
我命由我不由天
3楼-- · 2019-02-25 13:19

You should set the height of the footer

 func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return 15
}
查看更多
放荡不羁爱自由
4楼-- · 2019-02-25 13:22

In Xcode8, or latest Swift version, the method signature has been changed. This change might be causing your code to not call delegate method.

Fix it by writing method again using autocomplete.

Old Method -

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

New Method -

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

heightForHeaderInSection has to be used while using viewForHeaderInSection.

Hope this helped.

查看更多
登录 后发表回答