Тип '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
}
Ответы
Ответ 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)
, выделенные жирным шрифтом Требуемое.