En cours de développement d'une application contenant une liste de tous les éléments d'un tableau existant (qui se trouve dans un fichier .swift séparé). Ceci est fait par un tableView. Cependant, je n'obtiens qu'une vue de table vide à chaque fois. Une idée de ce qui ne va pas?
struct Location {
let title: String
let rating: String
let description: String
let latitude: Double
let longitude: Double
}
let locations = [
Location(title: "something", rating: "", description: "Old.", latitude: 10.11111, longitude: 1.11111),
Location(title: "something", rating: "", description: "Old.", latitude: 10.11111, longitude: 1.11111),
Location(title: "something", rating: "", description: "Old.", latitude: 10.11111, longitude: 1.11111)
]
En ce qui concerne le tableau, j'ai utilisé une structure. La structure est également appelée sur MKMapView.
struct Location {
let title: String
let rating: String
let description: String
let latitude: Double
let longitude: Double
}
Le fichier .swift contenant la structure et les données:
import UIKit
import MapKit
//Initialize the TableViewController
class CategoriesController: UIViewController, UITableViewDataSource, UITableViewDelegate {
//Retrieve the array
var locationsAll = [Location]()
//Outlet
@IBOutlet var tableView: UITableView!
//Load view
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return locationsAll.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "allCell") ?? UITableViewCell(style: .subtitle, reuseIdentifier: "allCell")
let location = locationsAll[indexPath.row]
cell.textLabel?.text = location.title
cell.detailTextLabel?.text = location.rating
return cell
}
}
I appelez-le dans le fichier en utilisant var locationsAll = [Location] ()
Merci d'avance!
3 Réponses :
Le nombre sera égal à 0. C'est pourquoi aucune cellule n'est rendue. après avoir ajouté des données, vous devez relodData sur la vue de table.
Je suppose que vous avez configuré la cellule dans un storyboard? Sinon, vous devez enregistrer la cellule avant de l'utiliser.
Oui, je l'ai fait via le storyboard. Lui a donné la propriété de sous-titres et autres. Identifiant également. Comment se fait-il que le décompte soit égal à 0?
Il n'y a pas de code ajoutant des données au tableau. Ou vous l'ajoutez après son exécution et vous devez envoyer un rechargement sur le thread d'interface utilisateur!
Merci @msphn!
Ensuite, vous avez besoin de
locationsAll = locations
tel qu'il apparaît let locations = [ est une variable globale donc il est accessible partout, ou vous pouvez déclarer
var locationsAll = [Location]()
puis dans viewDidLoad
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return locations.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "allCell") ?? UITableViewCell(style: .subtitle, reuseIdentifier: "allCell")
let location = locations[indexPath.row]
cell.textLabel?.text = location.title
cell.detailTextLabel?.text = location.rating
return cell
}
}
Ça a marché. Comment aurais-je pu manquer d'ajouter du style ... Merci beaucoup, beaucoup!
Il est déconseillé d'utiliser un tableau global comme source de données. Les données sont censées être encapsulées dans une structure, une classe ou une énumération.
Vous pouvez créer les emplacements à l'intérieur du contrôleur.
Remplacer
var locationsAll = Location.locations
avec
struct Location {
let title: String
let rating: String
let description: String
let latitude: Double
let longitude: Double
static let locations = [
Location(title: "something", rating: "", description: "Old.", latitude: 10.11111, longitude: 1.11111),
Location(title: "something", rating: "", description: "Old.", latitude: 10.11111, longitude: 1.11111),
Location(title: "something", rating: "", description: "Old.", latitude: 10.11111, longitude: 1.11111)
]
}
Ou déclarez les emplacements comme une variable statique dans la structure
var locationsAll = [
Location(title: "something", rating: "", description: "Old.", latitude: 10.11111, longitude: 1.11111),
Location(title: "something", rating: "", description: "Old.", latitude: 10.11111, longitude: 1.11111),
Location(title: "something", rating: "", description: "Old.", latitude: 10.11111, longitude: 1.11111)
]
et remplissez le tableau de source de données
var locationsAll = [Location]()
C'est en effet mieux. Je vais l'ajuster dans le code. Merci!
J'ai cependant un problème maintenant, j'ai utilisé une boucle for location in locations pour ajouter des annotations à mon mapView mais cela donne une erreur que je ne peux pas résoudre.
locations est une constante. Ajoutez les informations aux objets dans locationsAll dans le contrôleur.
Mille mercis! Le code est meilleur maintenant.
Vous n'ajoutez jamais aucun élément à votre tableau
locationsAllqui se trouve dans un fichier .swift séparé ??
@Joakim Danielson Que voulez-vous dire exactement? Le tableau est déjà rempli de données que je cherche à afficher via la tableView.
@Sh_Khan Le tableau, appelé Location. Parce qu'il y a plusieurs contrôleurs qui nécessitent les données qui se trouvent à l'intérieur du tableau.
ce tableau n'a pas l'air d'être rempli de données, pouvez-vous nous montrer comment et où le remplissez-vous de données?
locationsAll est laissez ==>
renvoyer locationsAll.countafin qu'il ne puisse pas être modifiéLe code n'affiche rien car le tableau de source de données
locationsAllest une constante et est vide. En dehors de cela, jamais nil-coalesc une cellule de vue de table standard, utilisez l'API non facultative:let cell = tableView.dequeueReusableCell (withIdentifier: "allCell", for: indexPath) code >@vadian Comment le tableau de sources de données peut-il être vide? Si je vérifie le fichier, il contient environ 170 éléments de données.
Si vous avez en quelque sorte un tableau global (
Location?), Vous devez y accéder dans votreCategoriesControlleret non danslocationsAll. Mais pouvez-vous vraiment faire ça?postez ce fichier, vous utilisez un tableau séparé ici, comment vous le liez
Comme mentionné par d'autres, veuillez ajouter le code où le tableau de source de données est rempli (il n'est pas dans le code actuel:
var locationsAll = [Location] ()déclare juste un tableau vide ). Et après avoir rempli le tableau de sources de données, vous devez appelerreloadData ()sur la vue de la tableAjout du code demandé. Et maintenant vous le mentionnez ... @vadian J'aurais en effet déclaré un nouveau tableau ****. Stupide ... Complètement manqué cette merde. Une idée comment utiliser mon rempli? Si possible, bien sûr.
Non, vous créez un tableau vide avec
[Location] ()@JoakimDanielson Alors, comment peut-on appeler un tableau existant?
Merci à tous pour votre aide! Cela m'a fait réaliser ce que j'avais mal fait.