UITableView 和 UITableViewDataSource

Posted

技术标签:

【中文标题】UITableView 和 UITableViewDataSource【英文标题】:UITableView and UITableViewDataSource 【发布时间】:2014-11-03 21:21:00 【问题描述】:

所以,我在 Xcode 中收到“类型 ViewController 不符合协议 UITableViewDataSource”错误。我已经实现了所需的功能:

cellForRowAtIndexPath numberOfRowsInSection

我什至确定我已经告诉 Xcode 有多少部分(这不是必需的)。这是一个单视图应用程序,我已确保我的引用在 Storyboard 中正确设置。所以我的奥特莱斯是我的视图和我的表视图。我的引用插座为 dataSource 和委托设置为我的表视图。

这是代码。

ViewController.swift

import UIKit

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

    var items: [String] = ["We", "Dislike", "Swift", "Very", "Much", "Right", "Now"]

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")

        tableView.delegate = self
        tableView.dataSource = self
    

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

    func numberOfSectionsInTableView(tableView: UITableView) -> Int
        return 1
    

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return self.items.count
    

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

        let cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath:indexPath) as UITableViewCell
        cell.textLabel?.text = self.items[indexPath.row]

        return cell
    

    func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) 
        println("You selected cell #\(indexPath.row)!")
    


编辑:另外,我知道我不应该需要 tableView.delegate 和 tableView.dataSource,因为我已经在 Storyboard 中分配了它们,但我想我会包括它们以确保你们都知道我知道有他们设置。

【问题讨论】:

【参考方案1】:

UITableViewDataSource 协议发生了一些变化。试试:

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

【讨论】:

谢谢...那行得通。那真的很烦人。我找到的所有教程都与我的代码中的教程相似。 Apple 仍在转换所有采用或返回隐式展开的可选项 (!) 的方法,并澄清它们以返回真正的可选项 (?) 或非可选实例。因此,每个新版本的 Xcode 中可能会有更多这样的内容。【参考方案2】:

您的tableView(tableView:cellForRowAtIndexPath) 签名错误 - 应该是:

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell 
    let cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath:indexPath) as UITableViewCell
    cell.textLabel?.text = self.items[indexPath.row]

    return cell

请注意,它不再返回可选值(即,没有! 后缀)。

【讨论】:

以上是关于UITableView 和 UITableViewDataSource的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 和 numberOfRowsInSection 崩溃

核心数据、UITableView 和 UISegmentedControl

UItableview 单元格的动态高度与 UItableview 单元格内的 UItableview

UITableView 中的 UITableView,填充了字符串和数组的 JSON 数组 [关闭]

UITableView

UITableView 旋转问题