Alternative à viewDidLoad

Hello,

Par souci pratique je dissocie ma sidebar outliview de la vue principal ce qui provoque quelques petits désagréments.
Je dois charger le contenu de la outline via awakenib avec une sorte de "rustine" pour que le comportement soit correcte.

Une idée d'alternative histoire que ce soit plus propre ?

Ca ressemble à ça pour le moment:
https://github.com/Old-Geek/Librairie/blob/master/Librairie/Sidebar/SidebarView.m#L68

Réponses

  • LexxisLexxis Membre

    Ne peux tu pas utiliser viewDidLoad du controller contenant la sidebar ?

  • klogklog Membre

    Pourquoi fais-tu 5 fois setItemList ?

  • @Lexxis a dit :
    Ne peux tu pas utiliser viewDidLoad du controller contenant la sidebar ?

    J'ai pas fait de viewcontroller (appdelegate only)

    @klog a dit :
    Pourquoi fais-tu 5 fois setItemList ?

    parce qu'en dessous de 3 ça ma laisse une vue vide, 3 c'est aléatoire + marge ocazou :)

    PorkZ inside :D

  • klogklog Membre
    mai 2019 modifié #5

    T'as essayé viewDidMoveToWindow ou viewDidMoveToSuperview (pour exécuter setItemList) ?

  • Je viens de tester et le résultat est assez surprenant, pour l'un ça décale l'affichage sélectionné sur un autre item et l'autre ça m'affiche celui que j'avais sélectionné 2 clicks auparavant :)

  • Mouaip, me suis résigné a créé un maincontroller avec un delegate...

    C'est toujours mieux que mon système de rustine.

  • LexxisLexxis Membre

    Ce qui est étonnant c'est que awakeFromNib est appelé plusieurs fois alors qu'il ne devrait être appelé qu'une seule fois par instance issue du NIB (enfin je crois). J'ai regardé un peu le code et j'ai une petite question: pourquoi ta classe SideBarView * fait-elle référence à une autre instance de *SidebarView ? La seule instance dans la fenêtre devait être amplement suffisante non ?

  • De ce que j'ai observé, awake ne se charge jamais une seule fois.

    Sur un outline, c'est chargé autant de fois qu'il y a d'item défini dans l'array. Quand il y un scroll pour afficher ce qui n'est pas encore visible awake est reloadé autant de fois que ce qu'il y a à afficher.

    En utilisant des tableview défini manuellement avec des cells ça permet une mise à jour en temps réelle des données comme je le fais ici: https://github.com/Old-Geek/MPD-Client/blob/master/MPD Client/Views/Playlist/PlaylistViewController.m#L56

    Si j'ai bien compris, c'est soit cette méthode soit gérer ça en passant par interfacebuilder mais le click click me donne des boutons. Tu ne vois rien, tu ne sais pas ce que tu fais, c'est beaucoup moins flexible et ce que tu gagne en temps sera perdu ailleurs.

    .> @Lexxis a dit :

    pourquoi ta classe SideBarView * fait-elle référence à une autre instance de *SidebarView ?

    Je ne vois pas de quoi tu parles O_o

  • @Harlo a dit :
    De ce que j'ai observé, awake ne se charge jamais une seule fois.

    Sur un outline, c'est chargé autant de fois qu'il y a d'item défini dans l'array. Quand il y un scroll pour afficher ce qui n'est pas encore visible awake est reloadé autant de fois que ce qu'il y a à afficher.

    En utilisant des tableview défini manuellement avec des cells ça permet une mise à jour en temps réelle des données comme je le fais ici: https://github.com/Old-Geek/MPD-Client/blob/master/MPD Client/Views/Playlist/PlaylistViewController.m#L56

    Si j'ai bien compris, c'est soit cette méthode soit gérer ça en passant par interfacebuilder mais le click click me donne des boutons. Tu ne vois rien, tu ne sais pas ce que tu fais, c'est beaucoup moins flexible et ce que tu gagne en temps sera perdu ailleurs.

    .> @Lexxis a dit :

    pourquoi ta classe SideBarView * fait-elle référence à une autre instance de *SidebarView ?

    Je ne vois pas de quoi tu parles O_o

    Le plus simple c'est de pas utiliser awake pour remplir tes données

    tu crée un méthode fillData()

    tu l'appelles quand ton app est chargé dans applicationDidFinishLaunching

  • @devulder a dit :

    Le plus simple c'est de pas utiliser awake pour remplir tes données

    tu crée un méthode fillData()

    tu l'appelles quand ton app est chargé dans applicationDidFinishLaunching

    Merci pour l'info, je vais regarder ça de plus près.

  • .> @Lexxis a dit :

    pourquoi ta classe SideBarView * fait-elle référence à une autre instance de *SidebarView ?

    Je ne vois pas de quoi tu parles O_o

    Ton fichier NIB fait apparaitre deux instances de SibBarView, une en tant qu'objet "indépendant", l'autre dans la fenêtre. Le premier ayant une référence (outlet) sur le second. Je trouvais cela étrange mais cela est peut être fait à dessein.

  • @Lexxis a dit :

    Ton fichier NIB fait apparaitre deux instances de SibBarView, une en tant qu'objet "indépendant", l'autre dans la fenêtre. Le premier ayant une référence (outlet) sur le second. Je trouvais cela étrange mais cela est peut être fait à dessein.

    Ah oui, c'est une erreur

  • @Harlo a dit :
    De ce que j'ai observé, awake ne se charge jamais une seule fois.

    Sur un outline, c'est chargé autant de fois qu'il y a d'item défini dans l'array. Quand il y un scroll pour afficher ce qui n'est pas encore visible awake est reloadé autant de fois que ce qu'il y a à afficher.

    En utilisant des tableview défini manuellement avec des cells ça permet une mise à jour en temps réelle des données comme je le fais ici: https://github.com/Old-Geek/MPD-Client/blob/master/MPD Client/Views/Playlist/PlaylistViewController.m#L56

    Si j'ai bien compris, c'est soit cette méthode soit gérer ça en passant par interfacebuilder mais le click click me donne des boutons. Tu ne vois rien, tu ne sais pas ce que tu fais, c'est beaucoup moins flexible et ce que tu gagne en temps sera perdu ailleurs.

    Effectivement tu as raison. awakeFromNib est appelé sur le owner lors d'un appel à makeViewWithIdentifier même si ce dernier est déjà initialisé.

  • LexxisLexxis Membre
    mai 2019 modifié #15

    J'ai fait quelques tests sur ton code:

    • Suppression de la variable _sidebarView de la classe SideBarView que j'ai remplacer par self (qui me semble plus en adéquation avec ce que fait la classe).
    • Ajout d'une variable non judicieusement appelé _initialized (BOOL) pour limiter l'appel à awakeFromNib (un seul appel)
    • Ajout de l'appel à initWithCoder pour l'initialisation des libraries
    • Suppression de l'objet SideBarView dans le NIB.
    • Modification du datasource et delegate dans le awakeFromNib
    • Outlet masterView depuis Interface Builder

    Résultat: plus besoin de la rustine viewDidLoadCompensation.

  • J'ai déjà modifé ça, j'ai créé un MainWindowController, collé un delegate "viewloaded" qui est envoyé à Sidebarview. awakeFromNib a été supprimé

    https://github.com/Old-Geek/Librairie/blob/master/Librairie/MainViewController.m

    Je viens de faire un push pour mettre à jour le git.

    Pour le reste il ne faut pas faire trop gaffe, ce n'est que du bricolage non définitif, une ébauche. Comme j'y connais rien, j'y vais à taton :)

  • klogklog Membre

    @Lexxis a dit :
    Ce qui est étonnant c'est que awakeFromNib est appelé plusieurs fois alors qu'il ne devrait être appelé qu'une seule fois par instance issue du NIB (enfin je crois).

    Non, malheureusement, awakeFromNib est parfois appelé plusieurs fois... Il semble me rappeler qu'il arrive que ce soit le cas sans même que l'objet ne soit initialisé.

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