类型'ViewController'不符合协议'UITableViewDataSource'

时间:2014-08-30 11:19:22

标签: ios uitableview swift

开始练习快速。在singleViewController中,我试图创建一个UITableView。在storyboard中我设置了数据源和委托。我在这里收到错误 *' ViewController'不符合协议' UITableViewDataSource' *

Screenshot for error

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    @IBOutlet weak var table: UITableView!


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

func numberOfSectionsInTableView(tableView: UITableView!) -> Int
{
    return 20
}
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
{
    let cell:UITableViewCell=UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "mycell")
cell.textLabel.text="row#\(indexPath.row)"
    cell.detailTextLabel.text="subtitle#\(indexPath.row)"

    return cell

}

18 个答案:

答案 0 :(得分:74)

您应该在最后}之前实现所有必需的方法,但是您已经在UIViewController之外编写了它们。此外,您需要更改行数的函数。

建议编辑

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    @IBOutlet weak var table: UITableView!


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(tableView:UITableView!, numberOfRowsInSection section:Int) -> Int
    {
        return 20
    }

    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
    {
        let cell:UITableViewCell=UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "mycell")
        cell.textLabel.text="row#\(indexPath.row)"
        cell.detailTextLabel.text="subtitle#\(indexPath.row)"

        return cell
    }
}

答案 1 :(得分:16)

尝试删除!在你的功能。那为我做了工作

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell:UITableViewCell=UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "mycell")
    cell.textLabel.text="row#\(indexPath.row)"
    cell.detailTextLabel.text="subtitle#\(indexPath.row)"

    return cell
}

答案 2 :(得分:10)

您需要实现UITableViewDataSource所需的所有方法才能摆脱该错误。

基本上......你错过了:

func tableView(tableView:UITableView!, numberOfRowsInSection section:Int) -> Int {
    //return XX
}

答案 3 :(得分:4)

我有同样的问题,在Objective-C中很容易锻炼,可能是因为我们现在对它更熟悉,但在这种情况下,swift非常新,因此,它的错误通知相当模糊

当我实现基于UITableView的应用程序时,我遇到了这个问题。我通过按下命令并单击UITableView打开了UITableView的实现文件。在实现文件中,我们可以清楚地看到两个函数是必须实现的,

  1. func tableView(tableView:UITableView,numberOfRowsInSection section:Int) - > INT
  2. func tableView(tableView:UITableView,cellForRowAtIndexPath indexPath:NSIndexPath) - > UITableViewCell
  3. 我到了这篇文章并开始把事情放在一起,同时牢记我对于Objective-C编程的微薄知识。错误的原因是表视图由两个元素定义,首先是节中的节和行,然后是tableview单元。默认情况下,表视图中至少有一个部分,但我们需要一致地了解部分中的行数。其次,我们需要知道我们将在一个部分的特定行中呈现哪个单元格。无论如何,即使我们使用默认的UITableViewCell,我们仍然需要一个标识符来访问它以设置其子视图或属性。 我希望它有所帮助,因为我自己是Swift的新手,所以会受到一点软批评:)

答案 4 :(得分:2)

只需添加这两种方法,然后就可以解决该错误[XCode8 Swift3]

第一种方法:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
}

第二种方法:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
}

答案 5 :(得分:2)

我在Swift中遇到了同样的问题。

你应该在类中实现UITableViewDataSource的所有函数,这意味着应该实现以下函数:

func numberOfSectionsInTableView(tableView: UITableView) -> Int{}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {}

我不确定是否缺少numberOfSectionsInTableView函数是否适合您。对我来说,我必须在课堂上认识到它。

答案 6 :(得分:2)

以下代码在iOS 8.1上对我无效。在XCode 6.1.1中。此代码有效:

import UIKit

class ViewController : UIViewController,UITableViewDelegate,UITableViewDataSource {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        //currently only a testing number
        return 25
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{

        var cell:UITableViewCell=UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "mycell")
        cell.textLabel?.text = "row#\(indexPath.row)"
        cell.detailTextLabel?.text = "subtitle#\(indexPath.row)"
        return cell
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

答案 7 :(得分:0)

只是提高可读性的建议,您可以使用扩展名分离您的协议,如下所示:

class ViewController: UIViewController {
    // Your lifecycle code here
}

extension ViewController: UITableDataSource { 
    func tableView(tableView:UITableView!, numberOfRowsInSection section:Int) -> Int {
         return 20
    }
}

extension ViewController: UITableViewDelegate {
    ...
}

答案 8 :(得分:0)

这可能是由于方法名称上的拼写错误或样式错误造成的。我曾经使用cmd +左键单击UITableView并复制&在我的UIViewController上粘贴方法名称;这不适用于Swift

而是键入func tableView,在列表中查找所需的方法,然后让auto complete完成其工作。

Autocomplete

答案 9 :(得分:0)

取出tableview和NSIndexpath的所有选项以获取最新的Xcode 6.1.1 GM_Seed

答案 10 :(得分:0)

这是一个常见的警告,意味着"你还没有实现协议所需的方法"

故事板上的视图对象可能需要数据源。例如,TableView需要一个数据源,通常,View Controller作为一个数据源。

因此Table View期望ViewController包含返回'必须具有'的方法。表格视图的信息。

表视图需要知道节的数量,每个节的行数等。

除非数据源对象返回所有必需的信息,否则警告将持续存在。

答案 11 :(得分:0)

根据新的swift 3文档更改“UITableViewDataSource”协议所需方法的语法:

internal func tableView(_ tableView:UITableView,numberOfRowsInSection section:Int) - > INT

internal func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath) - >的UITableViewCell

在使用swift 3编译器进行编译时,这对我有用。

答案 12 :(得分:0)

Ankit 的答案在Xcode 8 for Swift 2.3中为我工作。这是新语法。

extension ViewController: UITableViewDataSource {
    internal func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //return 1
    }

    internal func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        //return cell
    }
}

答案 13 :(得分:0)

添加这些方法

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
}

答案 14 :(得分:0)

复制ViewController类下面的代码并指定所需的行数(在第1部分中)并定义每个单元格的内容(在第2个函数中)

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {


public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return 1        //no. of rows in the section

}

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell  {

    let cell = UITableViewCell(style: <#T##UITableViewCellStyle#>, reuseIdentifier: <#T##String?#>)

}




override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

答案 15 :(得分:0)

通过自动完成建议进行一些编辑,从上面的答案中@MB_iOSDeveloper在swift 3,Xcode 8.3.2上,这段代码适用于我:

TypeError: unbound method as_base_exp() must be called with x instance as first argument (got nothing instead)

}

答案 16 :(得分:0)

通常,协议具有可选和必需的方法。例如, UISearchBarDelegate UITableViewDelegate 是您可以声明符合协议而不实施任何方法的情况。但它对 UITableViewDataSource

不起作用

在官方文档中,Protocol&#34; UITableViewDataSource&#34; - &GT;符号 - &gt;配置表视图,方法: func tableView(UITableView, cellForRowAt: IndexPath)func tableView(UITableView, numberOfRowsInSection: Int)以粗体必需关键字显示。

答案 17 :(得分:0)

只需删除 viewDidLoad() 并构建并添加 viewDidLoad() 一切正常