web-dev-qa-db-fra.com

Le type 'ViewController' n'est pas conforme au protocole 'UITableViewDataSource'

A commencé à pratiquer Swift. Dans singleViewController, j'essaie de créer un UITableView. Dans le storyboard, je définis la source de données et le délégué. Ici, je reçois le message d'erreur * 'ViewController' n'est pas conforme au protocole '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

}
50
Code cracker

Vous devez implémenter toutes les méthodes requises avant le dernier }, mais vous les avez écrites en dehors de UIViewController. En outre, vous devez modifier la fonction pour le nombre de lignes.

le montage suggéré

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

Essayez d'enlever le! sur votre func. Cela a fait le travail pour moi

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

Vous devez implémenter toutes les méthodes requises de UITableViewDataSource afin d'éliminer cette erreur.

En gros ... vous manquez

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

J’avais le même problème, les choses s’entraîneraient assez facilement dans Objective-C, probablement parce que nous le connaissons mieux pour le moment, mais dans ce cas, Swift est très nouveau, donc, ses notifications d'erreur sont plutôt vagues.

Lors de la mise en œuvre de l'application basée sur UITableView, j'ai rencontré ce problème. J'ai ouvert le fichier d'implémentation pour UITableView en appuyant sur commande et en cliquant sur UITableView. Dans le fichier d'implémentation, nous pouvons clairement voir que deux fonctions sont obligatoires pour l'implémentation,

  1. func tableView (tableView: UITableView, section numberOfRowsInSection: Int) -> Int
  2. func tableView (tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell

Je suis arrivé à ce poste et j'ai commencé à mettre les choses en place tout en gardant à l’esprit ma maigre connaissance de la programmation objectif-C. L'erreur est due au fait qu'une vue tabulaire est définie par deux éléments, la section et les lignes d'une section, puis les cellules de la table. Par défaut, il y a au moins une section dans la vue tableau, mais nous avons besoin de conformité quant au nombre de lignes dans une section. Deuxièmement, nous devons savoir quelle cellule allons-nous présenter dans une rangée particulière d'une section. Quoi qu'il en soit, même si nous utilisons UITableViewCell par défaut, nous avons toujours besoin d'un identifiant pour y accéder afin de définir ses sous-vues ou ses propriétés. J'espère que cela a été utile. Les critiques un peu douces seront appréciées car je suis moi-même très nouveau sur Swift :)

4
Muhammad Umar

Ajoutez simplement ces deux méthodes, puis cette erreur sera résolue [XCode8 Swift3]

première méthode:

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

Deuxième méthode:

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

Je venais de faire face au même problème à Swift.

Vous devez réaliser toutes les fonctions de la classe UITableViewDataSource, ce qui signifie que les fonctions suivantes doivent être réalisées:

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

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

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

Je ne suis pas sûr si manquer la fonction pour numberOfSectionsInTableView fonctionne pour vous ou non. Pour moi, je dois le réaliser dans ma classe.

2
Yuting

Le code suivant ne fonctionnait pas pour moi sur iOS 8.1. dans XCode 6.1.1. Ce code fonctionne:

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.
    }
}
2
MB_iOSDeveloper

Ajouter ces méthodes

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

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

Juste une suggestion pour améliorer la lisibilité, vous pouvez séparer vos protocoles par extension, comme ceci:

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

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

extension ViewController: UITableViewDelegate {
    ...
}
0
Valentin

Ceci est un avertissement courant qui signifie que "vous n'avez pas encore implémenté les méthodes requises du protocole"

Un objet de vue sur le storyboard peut nécessiter une source de données. Par exemple, TableView a besoin d'une source de données et généralement, View Controller agit en tant que telle.

Ainsi, Table View s'attend à ce que ViewController contienne les méthodes qui renvoient les informations "indispensables" pour la vue de table.

La vue tableau doit connaître le nombre de sections, le nombre de lignes dans chaque section, etc.

Sauf si toutes les informations requises sont renvoyées par l'objet de source de données, l'avertissement persistera.

0
KawaiKx

Supprimer toutes les options pour tableview et NSIndexpath pour le dernier Xcode 6.1.1 GM_Seed

0
ShaluRaj

En général, un protocole a des méthodes facultatives et obligatoires. Par exemple, ISearchBarDelegate et ITableViewDelegate sont les cas que vous pouvez déclarer conformes à un protocole sans implémenter aucune de leurs méthodes. Mais cela ne fonctionne pas bien pour ITableViewDataSource.

Dans la documentation officielle, Protocole "UITableViewDataSource" -> Symboles -> Configurer une vue tableau, les méthodes: func tableView(UITableView, cellForRowAt: IndexPath) et func tableView(UITableView, numberOfRowsInSection: Int) en gras obligatoire clé Word .

0
iDevSpread

La réponse de Ankit a fonctionné pour moi dans Xcode 8 pour Swift 2.3. Voici la nouvelle syntaxe.

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

avec quelques modifications suggérées par la saisie automatique, à partir de la réponse ci-dessus de @MB_iOSDeveloper sur Swift 3, Xcode 8.3.2, ce code fonctionne pour moi:

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

}

0
Nilo0f4r

Modifiez la syntaxe des méthodes requises par le protocole "UITableViewDataSource" comme indiqué dans la nouvelle documentation Swift 3:

fonction interne tableView (_ tableView: UITableView, section numberOfRowsInSection: Int) -> Int

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

Cela a fonctionné pour moi lors de la compilation avec le compilateur Swift 3

0
Ankit

Copiez le code ci-dessous sous la classe ViewController et spécifiez le nombre de lignes que vous souhaitez (dans la première section) et définissez le contenu de chaque cellule (dans la deuxième fonction).

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

}

0
yash yadav

Cela est probablement dû à une faute de frappe ou à un style incorrect sur le nom de la méthode. J'avais l'habitude de cmd + clic gauche sur UITableView et copier-coller les noms de méthodes sur mon UIViewController; qui ne fonctionnera pas sur Swift.

Au lieu de cela, tapez func tableView, recherchez la méthode de votre choix dans la liste et laissez l’auto-complétion faire son travail.

Autocomplete

0
Yunus Nedim Mehel