UITableView不符合协议UITableViewDataSource错误

时间:2017-02-02 09:15:14

标签: ios swift uitableview

问题1)

我花了几个小时试图找出这个问题,从我读过的那些是实现UITableView所需的两个函数,但它仍然给我标题中的错误:

import UIKit

class UITableView: UIViewController, UITableViewDataSource,UITableViewDelegate
{

    override func viewDidLoad()
    {

        super.viewDidLoad()

    }

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


    }


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

    }

}

问题2)

TableView是我为我的应用程序实现的选项卡式视图控制器的一部分。我希望我的TableView控制器有一个条目,一旦按下将打开另一个ViewController。我该如何实现类似的东西?

提前谢谢

3 个答案:

答案 0 :(得分:1)

您错误地设置了ViewController。创建一个UITableViewController,它只是一个UITableView,或者将UITableView添加到UIViewController(就像你几乎已经完成的那样)。

didSelectRowAt方法将允许你转换到一个新的viewController,但在我的例子中只有在故事板中正确设置。

UITableViewController选项

class TableViewController: UITableViewController {

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

// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 0
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return 0
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
    // Configure the cell...
    return cell
}

// MARK: - Table view delegate

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: false)
    performSegue(withIdentifier: "SegueIdentifier", sender: self)
}

UIViewController选项
(在此示例中需要通过Storyboard添加UITableView)

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self
}

// MARK: - Table view data source

func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 0
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return 0
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
    // Configure the cell...
    return cell
}

// MARK: - Table view delegate

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: false)
    performSegue(withIdentifier: "SegueIdentifier", sender: self)
}

Here is an example project to work from

答案 1 :(得分:0)

您不应该使用UITableView来管理数据源。这应该是UITableViewController的工作,它管理要在UITableView上显示的数据。 View一般只应该担心如何显示数据,而不是管理数据。请参阅Apple的MVC design pattern

Apple有一个非常好的,完整的Swift App tutorial(请参阅显示数据),其中介绍了如何使用使用storyboard构建的表视图设置UITableViewController。您还可以在页面末尾下载并运行源项目。我强烈推荐它。

答案 2 :(得分:-1)

您必须实施此Mendatory DataSource方法

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "", for: indexPath)
        return cell
    }

希望它有所帮助。