Подтвердить что ты не робот

Тип 'ViewController' не соответствует протоколу 'UITableViewDataSource'

Началась практика быстро. В singleViewController я пытаюсь сделать UITableView. В раскадровке я задал источник данных и делегат. Здесь я получаю сообщение об ошибке * '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

}
4b9b3361

Ответ 1

Вы должны реализовать все необходимые методы до последнего }, но вы написали их вне UIViewController. Кроме того, вам нужно изменить func для количества строк.

предлагаемое редактирование

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
    }
}

Ответ 2

Попробуйте удалить! по вашей функции. Это помогло мне

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
}

Ответ 3

Вам нужно реализовать все необходимые методы UITableViewDataSource, чтобы избавиться от этой ошибки.

В принципе... вам не хватает:

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

Ответ 4

У меня была та же проблема: все было бы легко работать в Objective-C, возможно, потому, что мы в настоящее время более знакомы с этим, но в этом случае быстрый очень новый, поэтому его уведомления об ошибках довольно расплывчаты.

Пока я выполнял приложение на основе UITableView, и я столкнулся с этой проблемой. Я открыл файл реализации для UITableView, нажав команду и нажав на UITableView. В файле реализации мы можем ясно видеть, что две функции обязательны для реализации,

  • func tableView (tableView: UITableView, numberOfRowsInSection: Int) → Int
  • func tableView (tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) → UITableViewCell

Я пришел на этот пост и начал собирать вещи, сохраняя скудное знание программирования objective-C. Причина ошибки в том, что представление таблицы определяется двумя элементами, сначала секцией и строками в секции, а также ячейками tableview. По умолчанию в представлении таблицы есть хотя бы один раздел, но нам нужно соответствие количества строк в секции. Во-вторых, нам нужно знать, какую ячейку мы собираемся представить в определенной строке в разделе. Несмотря на это, даже если мы используем UITableViewCell по умолчанию, нам по-прежнему нужен идентификатор для доступа к нему, чтобы установить его subviews или свойства. Я надеюсь, что это было полезно, Немного мягкая критика будет оценена по достоинству, так как я сам очень новичок в Swift:)

Ответ 5

Я только что столкнулся с той же проблемой в 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

Следующий код не работал у меня на 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

Просто добавьте эти два метода, затем эта ошибка будет решена [XCode8 Swift3]

первый метод:

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

Второй метод:

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

Ответ 8

Вытащите все опции для tableview и NSIndexpath для последней версии Xcode 6.1.1 GM_Seed

Ответ 9

Просто чтобы улучшить читаемость, вы можете отделить свои протоколы с помощью расширения, например:

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

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

extension ViewController: UITableViewDelegate {
    ...
}

Ответ 10

Вероятно, это связано с опечаткой или неправильным стилем имени метода. Я использовал для cmd + левый клик по UITableView и копировал и вставлял имена методов на мой UIViewController; который не будет работать на Swift.

Вместо этого введите func tableView, найдите нужный метод в списке и дайте автозаполнение выполнить свою работу.

Автозаполнение

Ответ 11

Это общее предупреждение, которое означает, что "вы еще не выполнили требуемые методы протокола"

Объекту просмотра на раскадровке может потребоваться источник данных. Например, TableView нуждается в источнике данных и обычно, View Controller действует как один.

Итак, Table View ожидает, что ViewController будет содержать методы, которые возвращают информацию "must have" для представления таблицы.

В представлении таблицы должно быть указано количество разделов, количество строк в каждом разделе и т.д.

Если вся необходимая информация возвращается объекту источника данных, предупреждение будет сохраняться.

Ответ 12

Измените синтаксис необходимых методов протокола "UITableViewDataSource" в соответствии с новой операцией быстрого документа 3:

внутренний func tableView (_ tableView: UITableView, numberOfRowsInSection раздел: Int) → Int

внутренний func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) → UITableViewCell

Это сработало для меня при компиляции с компилятором с быстрым 3

Ответ 13

Ответ Ankit работал у меня в Xcode 8 для 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
    }
}

Ответ 14

Добавьте эти методы

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

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

Ответ 15

Скопируйте приведенный ниже код под классом ViewController и укажите количество строк, которое вы хотите (в первом разделе), и определите содержимое каждой ячейки (во 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.
}

}

Ответ 16

с некоторыми исправлениями, предложенными автозавершением, из приведенного выше ответа от @MB_iOSDeveloper на swift 3, Xcode 8.3.2, этот код работает для меня:

class MenuViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

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

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> 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.
}

}

Ответ 17

В общем, протокол имеет необязательные и требуемые методы. Например, UISearchBarDelegate и UITableViewDelegate - это те случаи, когда вы можете заявить о соответствии протоколу, не применяя ни один из их методов. Но это не работает нормально для UITableViewDataSource.

В официальной документации протокол "UITableViewDataSource" → Символы → Настройка представления таблицы, методы: func tableView(UITableView, cellForRowAt: IndexPath) и func tableView(UITableView, numberOfRowsInSection: Int), выделенные жирным шрифтом Требуемое.