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' *
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
}
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
}
}
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
}
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
}
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,
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 :)
Ajoutez simplement ces deux méthodes, puis cette erreur sera résolue [XCode8 Swift3]
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
}
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.
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.
}
}
Ajouter ces méthodes
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
}
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 {
...
}
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.
Supprimer toutes les options pour tableview et NSIndexpath pour le dernier Xcode 6.1.1 GM_Seed
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 .
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
}
}
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.
}
}
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
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.
}
}
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.