2010-04-22 4 views
1

dans mon application J'ai un NSTableView lié à un ArrayController (arrangedObjects). J'ai aussi une vue détaillée (juste quelques champs de texte) liée au même contrôleur (sélection).Cocoa-Binding: Soumettre les modifications manuellement?

Maintenant, chaque fois que je modifie un champ de texte, les modifications sont automatiquement envoyées à ArrayController et la table change également. Comment puis-je éviter ça? Ce que je veux, c'est un "bouton de soumission". Les modifications sur les données doivent uniquement être envoyées au contrôleur lorsque j'appuie sur le bouton et pas automatiquement chaque fois que je fais une modification.

Répondre

2

Il y a vraiment deux réponses à cette question. Le premier est plus philosophique: dans la plupart des cas, vous voulez que les mises à jour du modèle se produisent instantanément. Pour la plupart, les utilisateurs ne devraient pas avoir à s'inquiéter de l'enregistrement, de l'enregistrement, etc. L'intégration omniprésente de Binding avec NSUndoManager signifie que tout ce que fait l'utilisateur peut être annulé (ou devrait être annulable). Toutes les actions de l'utilisateur doivent être «à faible risque», de sorte qu'une modification puis une annulation ne causent pas de «préjudice» inutile aux données de l'utilisateur ou à l'état de l'application. Si vous utilisez des données de base pour votre couche de modèle, vous pouvez toujours restaurer ou enregistrer un ensemble de modifications par programmation en utilisant les méthodes de NSManagedObjectContext. À moins qu'il n'y ait un vraiment bonne raison pour laquelle l'utilisateur a besoin d'un bouton "Soumettre", n'en mettez pas. Conformément à cette philosophie, la fonctionnalité "Annuler Envoyer" de Gmail. Même envoyer un email devrait être annulable (dans des limites raisonnables).

La deuxième réponse est plus pratique. Bien sûr, il y a des situations où vous avez affaire à un système de backend qui n'est pas aussi tolérant que celui de Cocoa. Dans ce cas, la meilleure option consiste à créer un objet de modèle temporaire qui sert de modèle pour l'interface utilisateur (pensez à un modèle de vue dans l'architectore MVVM (Model-View-View-Model)). Lorsque l'utilisateur soumet les modifications, vous pouvez copier l'objet de modèle temporaire dans le modèle persistant. Dans Données de base, vous pouvez utiliser un magasin persistant en mémoire sauvegardant un contexte d'objet géré distinct pour contenir ces instances temporaires, puis fusionner les modifications de ce contexte temporaire dans votre contexte principal sur submit.

0

Cela pourrait être suffisant:

  • Sélectionnez les champs de texte dans Interface Builder.
  • Passez au volet "Attributs de champ de texte" du panneau Inspecteur (appuyez sur Cmd-1).
  • Modifiez la boîte de dialogue Action à "Envoyé uniquement en entrée".
Questions connexes