UITableView 不符合协议

Posted

技术标签:

【中文标题】UITableView 不符合协议【英文标题】:UITableView does not conform to protocol 【发布时间】:2019-07-20 20:31:27 【问题描述】:

类型‘TVViewController’不符合协议‘UITableViewDataSource’

我对编程还很陌生,而且错误非常模糊,所以我不知道从哪里开始排除故障。

class WeeksViewController: UIViewController, UITableViewDataSource 

    //Categories
    var categories = ["One", "Two", "Three", "Four", "Five", "Six", "Seven"]

    //Number of sections
    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return categories.count
    

    //Defining the headers
    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
        return categories[section]
    

    //Number of rows
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 1
    

    //Cell as identifier & category as the class
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! CategoryRow
        return cell
    




【问题讨论】:

【参考方案1】:

您复制并粘贴了 Swift 2 代码。这些是正确的 Swift 3+ 方法

class WeeksViewController: UIViewController, UITableViewDataSource 

    //Categories
    var categories = ["One", "Two", "Three", "Four", "Five", "Six", "Seven"]

    //Number of sections
    func numberOfSections(in tableView: UITableView) -> Int
        return categories.count
    

    //Defining the headers
    func func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
        return categories[section]
    

    //Number of rows
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 1
    

    //Cell as identifier & category as the class
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", for: indexPath) as! CategoryRow
        return cell
    


看看documentation总是值得的

【讨论】:

【参考方案2】:

我认为问题在于numberOfRows 数据源方法的名称拼写错误,cellForRow 签名也有点不对。

而不是这些:

func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    return categories.count

...
func func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    // 

你可能想要这些:

func numberOfSections(in tableView: UITableView) -> Int 
   return categories.count

...
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    // code

【讨论】:

以上是关于UITableView 不符合协议的主要内容,如果未能解决你的问题,请参考以下文章

类型“ViewController”不符合协议“UITableViewDataSource”

刷新 UITableView 而不刷新节标题

如何使UITableview中的DPFBannerView不滚动

在主线程上调用 tableView.reloadData 后 UITableView 不刷新

UITableView 和 UITableViewDataSource

iOS 不符合键值编码的 uitableview