1
votes

Affichage du tableau dans tableView

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!


15 commentaires

Vous n'ajoutez jamais aucun élément à votre tableau locationsAll


qui 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.count afin qu'il ne puisse pas être modifié


Le code n'affiche rien car le tableau de source de données locationsAll est 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)


@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 votre CategoriesController et non dans locationsAll . 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 appeler reloadData () sur la vue de la table


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


3 Réponses :


0
votes

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.


3 commentaires

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!



2
votes

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


1 commentaires

Ça a marché. Comment aurais-je pu manquer d'ajouter du style ... Merci beaucoup, beaucoup!



1
votes

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]()


4 commentaires

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.