Table view liées

Bonjour à tous,

après avoir réussi à créer des app avec Table View je souhaiterai créer une tableView initiale qui permette de créer un item au sein duquel je puisse créer d’autres items.
Typiquement, créer une équipe dans la 1ere tableView puis pour cette équipe, créer différentes courses ou matchs liés dans la seconde.
Dans quelle direction dois-je me tourner? Je précise que je travaille avec Realm.

Merci de vos lumières toujours avisées.

Hello @jeancharles.bidault

Si j’ai bien compris, tu aimerai avoir un premier écran avec (par exemple) une liste d’équipe, et ensuite, en fonction de l’équipe sur laquelle tu cliques, tu serais redirigé vers un second écran avec des courses (par exemple) ?

Bonne journée,

Alexandre

Bonjour Alexandre,

oui, c’est ça.

Perso, je ferai une première table view où tu place tes éléments comme on l’a vu avec Maxime dans le cours (et comme tu sais le faire, si je lis bien ton premier post), ensuite, tu utilises le prepareForSegue pour aller vers un autre écran en lui passer les infos de la cellule sur laquelle l’utilisateur vient de cliquer (deuxième écran qui en fait est un tableViewController aussi) et une fois que tu es dans ce deuxième écran, dans le viewDidLoad, tu récupères les infos dont tu as besoin dans la DB Realm pour les afficher dans ta tableView comme tu l’as fait pour le premier écran.

Je sais pas si je suis ± compréhensible ?
Je te ferai bien un exemple, mais je n’ai pas xCode sous la main dans l’immédiat…

Le truc c’est la liaison entre les 2 entrées de la base de données. Il faut que les entrées de la 2ème table soit liées à ma 1ère table.

Alors le soucis que tu as est plutôt dans la conception de la base de donnée et des requêtes ?

J’ai pas commencé réellement car je ne vois pas comment relier une entrée de la base 1 (tableView1) à celles de la 2ème base (TableView2).
Dans ma réflexion, j’imagine créer 2 bases Realm sur 2 classes:

  • une class Team
  • Une class Course

et bien sur comme dans le cours:

  • TeamManager: gestion des équipes
    -CoursesManager: gestion des courses pour chaque Team

Après… c’est là que je ne vois pas comment faire.

Je te fais un exemple dès que j’ai un peu de temps :slight_smile:

Voilà voilà, j’ai pu le coder en vitesse pour te faire un exemple:
(J’ai gardé l’exemple très simple, mais libre à toi de le compléter selon tes besoins)

Tout d’abord, j’ai créé deux classes (Team et Courses):

class Team:Object {
    @objc dynamic var nom:String = ""
    let courses = List<Course>()  // Les courses auxquelles l'équipe à participé
}

class Course:Object {
    @objc dynamic var nom:String = ""
    let teams = LinkingObjects(fromType: Team.self, property: "courses") // Les équipes qui ont participés
}

Ensuite le manager de la classe Team:

class TeamManager {
    static func getTeams() -> Results<Team> {
        let realm = try! Realm ()   
        return realm.objects(Team.self)
    }
}

Ensuite, voici ce que donne mon StoryBoard:

Un navigation controller pour les transitions entre les écrans, et ensuite deux TableViewController avec les cellules en mode « Basic »
(Il ne faut pas oublier de définir le nom du Segue et les identifier des cellules de tes tableView)

Ensuite, voici le code de mes TableViewController:

Mon premier TableViewController (que j’ai appelé FirstTableViewController, original, je sais :grin:)

class FirstTableViewController: UITableViewController {
    
    var _teams:Results<Team>?

    override func viewDidLoad() {
        super.viewDidLoad()
        _teams = TeamManager.getTeams()
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        guard let teams = _teams else {
            return 0
        }
        
        return teams.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell:UITableViewCell! = tableView.dequeueReusableCell(withIdentifier: "cellFirstVC")
        
        if let teams = _teams {
            let team:Team = teams[indexPath.row]
            if let label = cell.textLabel {
                label.text = team.nom
            }
        }
        
        return cell
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "segueTeamCourse" {
            if let cell = sender as? UITableViewCell {
                if let indexPath = self.tableView.indexPath(for: cell),
                    let teams = _teams {
                    let selectedTeam = teams[indexPath.row]
                    
                    let secondVC:SecondTableViewController = segue.destination as! SecondTableViewController
                    secondVC._team = selectedTeam
                }
            }
        }
    }
    
}

Et mon deuxième TableViewController … SecondViewController:

class SecondTableViewController: UITableViewController {

    var _team:Team?
    var _courses:List<Course>?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if let team = _team {
            _courses = team.courses
        }
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        guard let courses = _courses else {
            return 0
        }
        return courses.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell:UITableViewCell! = tableView.dequeueReusableCell(withIdentifier: "cellSecondVC")
        
        if let courses = _courses {
            let course:Course = courses[indexPath.row]
            if let label = cell.textLabel {
                label.text = course.nom
            }
        }
        
        return cell
    }

}

Dans un premier temps, je te poste tout ceci tel quel pour te permettre de décortiquer, et d’avancer, mais si il y a quelque chose que tu ne comprends pas, n’hésite pas à demander, je t’y répondrai du mieux que je peux! :smile:

(N’oublie pas de déballer les optionnels de manière un peu plus Secure)

EDIT: Je me suis rendu compte qu’il y avait plus simple, j’ai rectifier dans le code ci-dessus.

Bon après-midi,

Alexandre

2 « J'aime »

je regarde ça dès que je peux et te tiens au jus! Merci