Question

Alors voici ce que j'ai:

  • Un NSTableView avec une source de données NSMutableArray
  • FSEvents surveille un dossier contenant le fichier contenant les données de la vue table (Utilisation de SCEvents pour la qualité d'abstraction Objective-C)
  • FSEvents déclenche la même fonction qu'un bouton de rechargement de l'interface utilisateur. Cette fonction rafraîchit la vue table avec une nouvelle source de données basée sur le contenu dudit fichier via setDataSource: .

Et voici ce qui se passe:

  • Si je modifie le fichier, FSEvent est déclenché et la méthode d'actualisation est appelée.
  • Le tableau que la vue table devrait accepter comprend en effet les modifications qui ont déclenché l'événement FSEvent.
  • setDataSource: est envoyé au NSTableView avec la source de données correcte.
  • Les modifications n'apparaissent pas dans la vue tableau!

Mais ensuite:

  • Si je clique sur le bouton d'actualisation, qui déclenche exactement la même méthode que FSEvent, la vue tabulaire est mise à jour avec les nouvelles données.

J'ai également essayé de remplacer FSEvent par une notification NSNotification ( NSApplicationDidBecomeActiveNotification ), mais la même chose se produit.

Quelqu'un sait-il pourquoi cela se produit?

Éditer: pour plus de clarté, voici ma première question: pourquoi mon NSTableView est-il rechargé comme il se doit lorsqu'il est déclenché par une pression sur un bouton, mais pas par un FSEvent ou une NSNotification?

Modifier: Merci à diciu , I 'ai découvert qu'en fait, toutes mes références d'interface utilisateur pointent vers 0x0 lorsqu'elles sont déclenchées par l'événement, mais qu'elles ont ensuite des adresses valides lorsqu'elles sont déclenchées par le clic du bouton. Ces objets sont tous déclarés dans IB, il n'y a donc pas d'instanciation ni d'allocation pour eux dans mon code. Ma question est donc la suivante: que puis-je faire pour empêcher ces pointeurs de pointer vers zéro?

Était-ce utile?

La solution

semble que lorsque vous vous inscrivez pour l'événement / la notification, vous passez dans une instance différente de votre classe de contrôleur.

Autres conseils

Nous appelons reloadData sur NSTableView lorsque nous avons de nouvelles données à ajouter / supprimer à la table.

Ceci pourrait aider à forcer le redessin de NSTableView.

Je ne suis pas vraiment sûr de savoir si c'est ce que vous demandez. Le libellé de votre question est un peu déroutant, vous énoncez une série d’événements, mais jamais une vraie question.

Avez-vous essayé d'appeler votre méthode depuis votre FSEvent lors d'un deuxième passage de la boucle d'exécution?

[myObject performSelector:@selector(reloadAction:) withObject:nil afterDelay:0.0];

Vous définissez un NSArray directement comme source de données de la vue tableau?

Ce n'est pas ainsi que NSTableView fonctionne. La source de données doit être un objet conforme à NSTableDataSource . NSArray ne le fait pas. Vous écrivez la source de données vous-même; ce sera probablement le même objet que vous avez actuellement en appelant setDataSource: .

L’autre méthode consisterait à utiliser des liaisons.

Est-il possible que la référence à la vue table dans l'étendue de votre méthode d'actualisation ne soit pas valide?

I.e. êtes-vous sûr de ne pas appeler [nil reloadData] ce qui ne génère aucune erreur? Votre référence à votre vue table peut être nulle dans le code d'actualisation si vous la définissez avant awakeFromNib ou dans d'autres circonstances.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top