Liaison List et detailItem

Lorsque je sélectionne un élément de ma liste j'accède à ma vue détailItem dans laquelle je retrouve mes données chargées par .onAppear() depuis un managedObject . Après modification j'utilise onDisappear() pour récupérer les nouvelles valeurs et les stocker dans mon managedObject. Jusque là tout se passe à merveille. Les modifications apparaissent.

Problème : si je tente de cliquer de nouveau sur la même ligne elle se sélectionne et je ne peux pas accéder au détail item.
À noter que je peux accéder aux autres ligne et lorsque j'accède à une autre ligne je peux ensuite accéder à celle modifiée auparavant.

Une idée ? Peut-être faut-il effectuer un reload de la liste, mais comment le provoquer ?

Réponses

  • CéroceCéroce Membre, Modérateur

    Bonjour Fleurantin,

    Ton message est confus. D'après ce que je comprends, tu es dans la situation d'une combinaison Master-Details, avec une UITableView pour le Master. Déjà, les deux View Controllers sont-ils visibles en même temps à l'écran ?

    Est-ce que le problème est que la cellule du Master étant déjà sélectionnée, sélectionner une deuxième fois ne rafraîchit pas les Détails ?

    N'hésite pas à ajouter une copie d'écran pour nous rendre la situation plus concrète.

  • Liste avant clic sur la première
    Détail avant retour sur la liste
    Clic sur la première ligne => rien ne se passe

  • Salut Fleurantin,

    Tu as bien changé sur ta photo de profil... ;)

    Pour ton problème, un peu de ton code aiderait pour essayer de le résoudre.

  • CéroceCéroce Membre, Modérateur
    février 2020 modifié #5

    Je dirais que le problème est que la cellule étant sélectionnée dans la Liste, alors l'appuyer à nouveau ne va pas appeler tableView(_, didSelectRowAt:).

    Doc d'Apple:

    If you respond to the cell selection by pushing a new view controller onto the navigation stack, deselect the cell when the view controller pops off the stack. If you’re using a UITableViewController to display a table view, you get the behavior by setting the clearsSelectionOnViewWillAppear property to true. Otherwise, you can clear the selection in your view controller’s viewWillAppear(_:) method:

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if let selectedIndexPath = tableView.indexPathForSelectedRow {
            tableView.deselectRow(at: selectedIndexPath, animated: animated)
        }
    }
    

    Donc, le plus simple est, dans le storyboard de sélectionner le UITableViewController puis cocher Selection: Clear on Appearance.

  • Désolé. Pas de storyboard car je travaille sur SwiftUI. Mais la solution de désélectionner la ligne me semble une bonne piste Je testerai en rentrant chez moi dimanche.
  • > @Eric P. a dit :
    > Salut Fleurantin,
    >
    > Tu as bien changé sur ta photo de profil... ;)
    >
    > Pour ton problème, un peu de ton code aiderait pour essayer de le résoudre.

    C’est ma dernière petite fille. Le temps passe...
  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2020 modifié #8

    J'ai trouvé quelque part que, pour le moment, il y a une bogue avec Xcode 11.3.1, où, en retournant de la page Detail, on ne peut pas cliquer sur la même ligne deux fois ; il faut choisir une autre avant de re-cliquer la première :( Mais c'est connue chez Apple

    Néanmoins, si tu utilises SwifUI, les mises à jour des détails sont propagées automatiquement par Combine.

    J'ai ajouté, en pièce-jointe, un projet que je viens de rédiger.

    C'est dur d'apprendre le SwiftUI, surtout lorsque il n'y a que très peu de documentation et exemples :pensive:

  • Je confirme que c'est dur de se lancer dans SwitfUI sans une documentation correcte (sans parler des notifications d'erreurs souvent farfelues). J'ai eu l'impression de retourner à mes débuts (1990) sur Lightspeed Pascal sans documentation.
    Heureusement il y a des exemples par-ci par-là sur la toile.
    Merci pour ton envoi. Je vais tester le passage de l'object en @ObservedObject pour automatiser les changements.

  • Joanna CarterJoanna Carter Membre, Modérateur

    @fleurantin a dit :
    Je vais tester le passage de l'object en @ObservedObject pour automatiser les changements.

    Tu m'as donné l'impression que tu travailles avec CoreData, car tu as référencé ManagedObject. Dans ce cas là, c'est déjà prise en charge.

    Néanmoins, en t'aidant, ça m'a donné l'opportunité de jouer avec SwiftUI pour la première fois :D

  • @Joanna Carter a dit :

    Néanmoins, en t'aidant, ça m'a donné l'opportunité de jouer avec SwiftUI pour la première fois :D

    Un petit topic pour nous donner tes impressions de premier contact ?

Connectez-vous ou Inscrivez-vous pour répondre.