Récupérer la ligne d'un tableau qui va être affichée

muqaddarmuqaddar Administrateur
18:21 modifié dans API AppKit #1
Si selectedRow permet de récupérer la ligne sélectionnée, comment récupérer la ligne qui va être sélectionnée avant une validation de sélection possible grâce au delegate :
- (BOOL)selectionShouldChangeInTableView:(NSTableView *)aTableView

Car suite à  une boà®te de dialogue qui confirme ou non l'enregistrement, il faut afficher cette fameuse nouvelle ligne sur laquelle on vient d'appuyer.

Mais suis-je clair ?

Réponses

  • Eddy58Eddy58 Membre
    18:21 modifié #2
    Un peu plus de détails sur le fonctionnement voulu serait cool Oxitan, car là  perso je comprend la moitié de ce que tu veux. ;)
  • 18:21 modifié #3
    Ce n'est pas la bonne méthode de délégué tout simplement...

    Regarde la suivante (dans la table des matière).
  • muqaddarmuqaddar Administrateur
    18:21 modifié #4
    dans 1122928641:

    Ce n'est pas la bonne méthode de délégué tout simplement...

    Regarde la suivante (dans la table des matière).


    Moi, je pensais que c'était la bonne pour ce que je veux faire. Qu'appelles-tu la table des matières ? Si je regarde les méthodes délégués de NSTableView, la suivante est : tableView:didClickTableColumn:
    qui n'a rien à  voir.

    Cependant, je pense que tu veux p-e parler de celle-ci :
    - (void)tableViewSelectionIsChanging:(NSNotification *)aNotification

    qui ne me va pas non plus puisque la sélection est effectuée avant que je n'ai pu confirmer la moindre boà®te de dialogue concernant la sélection précédente.
    Normalement, celle qui m'intéresse est bien celle de mon premier post : - (BOOL)selectionShouldChangeInTableView:(NSTableView *)aTableView

    à  savoir si on autorise le changement de sélection (dans mon cas, une fois la confirmation effectuée par boà®te de dialogue).
  • août 2005 modifié #5
    Excuse moi, mais ...comment fais-tu? Je te l'avais déjà  signalé il y a quelque mois, apprends à  bien te servir de la doc, et tu trouveras beaucoup de réponses à  tes questions.

    [tt]- (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex[/tt]

    Sinon la table des matières est la liste des méthodes de délégués au début de la page de nstableview.
  • muqaddarmuqaddar Administrateur
    18:21 modifié #6
    dans 1122931451:

    Excuse moi, mais ...comment fais-tu? Je te l'avais déjà  signalé il y a quelque mois, apprends à  bien te servir de la doc, et tu trouveras beaucoup de réponses à  tes questions.

    [tt]- (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex[/tt]

    Sinon la table des matières est la liste des méthodes de délégués au début de la page de nstableview.


    Et bien, je n'avais pas remarqué que l'ordre de la liste dans la table des matières n'est pas le même que l'ordre des méthodes expliquées.
  • muqaddarmuqaddar Administrateur
    18:21 modifié #7
    Bon, j'ai toujours le même problème de "logique".

    Voilà  le delagate :

    - (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex<br />{	<br />	return [_IBO_gererVinController isThereChanges:rowIndex];	<br />}
    


    Puis la méthode qui doit envoyer YES, mais seulement après affichage de la boà®te de dialogue, et ce, que l'on clique sur valider ou non.

    - (BOOL)isThereChanges:(int)row<br />{<br />	if ([_IBO_vinTableView selectedRow] != -1) {<br />		if (_isModified == YES) {<br />			NSBeginAlertSheet(NSLocalizedString(@&quot;ModificationsEffectuees&quot;, nil), NSLocalizedString(@&quot;Oui&quot;, nil),NSLocalizedString(@&quot;Non&quot;, nil), nil,_IBO_wndMain,self,@selector(changesSheetDidEnd:returnCode:contextInfo:), NULL,NULL,NSLocalizedString(@&quot;DesChangementsOntEteEffectuesSurCeVin&quot;, nil));			<br />			return YES;<br />		}<br />		else return YES;<br />	}<br />	else return YES;<br /><br />}
    


    et

    - (void)changesSheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo<br />{<br />	if(returnCode == NSOKButton) [self IBA_saveModifsVin: nil];<br />}
    


    Sauf que dans mon cas, le return YES (juste après l'ouverture de la sheet) est trop tôt, il devrait avoir lieu dans la méthode suivante... qui elle n'est pas reliée à  mon delegate.

    Je pensais envoyer le numéro de ligne qui doit être sélectionné, et faire un selectRow dans la dernière méthode, mais mon seul moyen serait d'en faire une variable d'instance, ce qui semble démesuré.

    Quelle autre solution avez-vous ?
  • muqaddarmuqaddar Administrateur
    18:21 modifié #8
    Bon, voilà , tout marche nikel.

    Il ne me reste plus qu'à  contrôler la notification sur le texte des NSTextView qui ne répond pas à  : NSControlTextDidChangeNotification. Et je n'ai rien vu d'intéressant dans les autres notifications proposées.

    Celle-ci n'est valable que pour les changements d'attributs :
    NSTextViewDidChangeTypingAttributesNotification

    L'ai-je loupé ou dois-je procéder autrement ?
  • Eddy58Eddy58 Membre
    18:21 modifié #9
    As-tu essayé avec la méthode delegate suivante ? :)
    [tt]- (BOOL)textView:(NSTextView *)aTextView shouldChangeTextInRange:(NSRange)affectedCharRange replacementString:(NSString *)replacementString
    [/tt]
    Elle va t'indiquer qu'un changement va avoir lieu, tu fais alors ce que tu as à  faire et tu retournes YES pour autoriser le changement.
  • muqaddarmuqaddar Administrateur
    18:21 modifié #10
    Super j'ai envoyé une notif dans ce delegate et bidouillé un petit peu dans ma méthode de réception des notifs et ça marche impec. Merci Eddy !

    :adios!:
  • muqaddarmuqaddar Administrateur
    18:21 modifié #11
    Saperlipopette !

    Je me suis fait avoir.
    Mes objets observateurs surveillent tous les contrôles, mêmes ceux des préférences. Et j'ai des tags qui ont la même valeur ds ma fenêtre des préférences que ma fenêtre principale. Du coup, il notifie aussi quand je modifie ces fields, ce qu'il ne faut pas.

    Peut-on cantonner (pas le riz) la notification à  une fenêtre en particulier ? Où suis-je condamné à  modifier mes tags ds mes préférences ?
  • Eddy58Eddy58 Membre
    18:21 modifié #12
    Tu peux comparer l'objet dont la notification est issue et voir s'il appartient à  une fenêtre ou une autre, mais ça t'épargnera du code de changer tes tags. :)
  • muqaddarmuqaddar Administrateur
    août 2005 modifié #13
    Ah c'est cool, donc il faut faire un truc du genre :

    if ([notification object] appartientAmaFenetre:_mainWindow)...


    Sans exagérer, je ne vois vraiment pas par quelle méthode je peux vérifier qu'un objet est inclu dans la vue d'une fenêtre.  :crackboom:-

    Peux-tu me mettre sur la voie ?
    merci :why?:
  • Eddy58Eddy58 Membre
    août 2005 modifié #14
    Justement, rien à  ma connaissance n'est prévu pour faire ça facilement...:-\\
    A toi de savoir quels objets sont dans telle fenêtre et ensuite de faire l'action désirée selon la comparaison (via les outlets ou des arrays repertoriant pour chaque fenêtre les pointeurs des objets la composant), mais c'est assez lourd, et je pense vraiment qu'il faut plutôt tagger tes objets (et pas tes murs ;)) en réorganisant les tags du mieux possible, par exemple, les tags d'une fenêtre commençant par 1, ceux d'une autre fenêtre commençants par 2, etc...:)
  • 18:21 modifié #15
    [tt]if ([[notification object] window]==_mainwindow)[/tt]
  • août 2005 modifié #16
    dans 1123019684:

    qu'il faut plutôt tagger tes objets (et pas tes murs ;)) en réorganisant les tags du mieux possible, par exemple, les tags d'une fenêtre commençant par 1, ceux d'une autre fenêtre commençants par 2, etc...:)


    Beaucoup trop compliqué à  traiter, les opérateurs & | et ^ sont bitwise. J'avais expliqué ce principe dans l'annexe de mon tuto sur le glissé-déposé.

    Et donc le principe serait de dire les tags des préférences sont dans [2048,4096[ (on est pas obligé de le faire avec une puissance de 2 ceci dit, mais c'est plus simple à  gérer). Donc pour savoir si un controle vient d'une fenêtre, on fait juste pour les prefs
    [tt]if ([[notif object] tag] & 2048)[/tt]
  • Eddy58Eddy58 Membre
    18:21 modifié #17
    dans 1123022544:

    [tt]if ([[notification object] window]==_mainwindow)[/tt]

    C'est vrai que l'on peut récupérer la window via l'héritage NSView, cette solution serait vraiment la plus pratique...sinon j'irais jeter un coup d'oeil à  ton tuto sur le drag&drop pour les explications sur le bitwise. :)
  • muqaddarmuqaddar Administrateur
    18:21 modifié #18
    Merci Renaud pour :

    if ([[notification object] window]==_mainwindow)

    En revanche, je ne suis pas sûr d'avoir compris le bitwise... Il faudra que je relise ton article.

    En ce qui concerne l'organisation de mes tags, il n'y a que dans les préférences que certains avaient la valeur de ceux de mon application. Mais j'y veillerai la prochaine fois.

    merci à  tous les deux
Connectez-vous ou Inscrivez-vous pour répondre.