Déroutante ComboBox

mac_manumac_manu Membre
Bonjour la compagnie,
J'ai implémenté une série de NSComboBox pour fonctionner avec des dataSource. Dans Interface Builder j'ai coché la case Uses Data Source et la case Completes pour compléter automatiquement le mot lors de la frappe (Si le mot existe of course) et j'ai relié ces objets comme delegate à  mon NSController.
Et là , le résultat est plutôt étonnant. Lors des premières saisies, tout fonctionne. Ensuite, avec la même lettre introduite, il ne reconnait plus le mot qu'il venait pourtant de reconnaà®tre, mais lorsque l'on clique sur la flèche down de la ComboBox et que l'on relâche, ça re-fonctionne, pour une ou deux fois. Puis, après environ 5 utilisations, elle ne reconnait plus rien. Quelqu'un voit d'où peut venir le problème?  :fouf):

Réponses

  • BruBru Membre
    03:14 modifié #2
    dans 1159389624:

    [...]Lors des premières saisies, tout fonctionne. Ensuite, avec la même lettre introduite, il ne reconnait plus le mot qu'il venait pourtant de reconnaà®tre, mais lorsque l'on clique sur la flèche down de la ComboBox et que l'on relâche, ça re-fonctionne, pour une ou deux fois. Puis, après environ 5 utilisations, elle ne reconnait plus rien. Quelqu'un voit d'où peut venir le problème?  :fouf):


    C'est pas très clair ce que tu dis...
    Tu dis "Ensuite...", mais ensuite après quoi ?
    Quand tu tapes, le mot le plus proche s'affiche. Tant que tu ne valides pas (via touche Entrée, ou sélection par la combo), tu es toujours en mode recherche. Peut-être ceci explique t'il ton "problème"...

    A part les traditionnels "ça marche pas" ou "comportement étrange", tu n'expliques ce qu'il faut pour qu'on reproduise l'éventuel bug...

    Chez moi, tout me semble OK, alors soit plus explicite !

    .
  • mac_manumac_manu Membre
    03:14 modifié #3
    <3 <br />Merci Bru pour ta réponse, qui m'a permis ce matin de découvrir le bug en voulant d'avantage cerner le blème. En fait, un popUpBtn me permet de changer de dataSource, et j'avais tout simplement oublié d'implémenter un reloadData sur ma ComboBox. Alors forcemment, ça ne pouvait que produire se genre de fonctionnement... déroutant. Alors à  l prochaine et... :p
  • mac_manumac_manu Membre
    03:14 modifié #4
    Encore une p'tite question: Quand dois-je implémenter un reloadData pour une NSComboBoxCell de ma tableView? Dans "setObjectValue" ou dans "willDisplayCell" sachant que mon popUpBtn qui change ma dataSource est cette fois un NSPopUpBtnCell de ma tableView...
  • BruBru Membre
    03:14 modifié #5
    dans 1159428674:

    Encore une p'tite question: Quand dois-je implémenter un reloadData pour une NSComboBoxCell de ma tableView? Dans "setObjectValue" ou dans "willDisplayCell" sachant que mon popUpBtn qui change ma dataSource est cette fois un NSPopUpBtnCell de ma tableView...


    Ton cas n'est pas simple.

    Puisque ton combo est dans le NSTableView, cela suppose qu'il n'y a qu'1 seul NSComboBoxCell qui est utilisé pour toutes les lignes du tableau : donc, il n'y a qu'un seul datasource, et 1 seul contenu pour tous les combos.

    Ainsi, à  chaque reloadData, c'est le contenu de tous les combos de la table qui va changer, et ceci quelque soit la sélection courante dans le popup correspondant (celui de la même ligne).
    C'est clair que ça va foutre un bordel monstre...

    Je serais d'avis d'utiliser le delegate tableView:willDisplayCell:forTableColumn:row: de NSTableView.
    Dans ce delegate, il te faudra récupérer la sélection courante du popup correspondant, afin d'enchaà®ner un reloadData sur le NSComboBoxCell.

    - (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex<br />{<br />&nbsp; &nbsp; NSString *popupValue;<br /><br />&nbsp; &nbsp; if ([[aTableColumn identifier] isEqual:@&quot;combo&quot;])<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; // lecture de la sélection du popup attaché<br />&nbsp; &nbsp; &nbsp; &nbsp; popupValue=[self tableView:aTableView objectValueForTableColumn:[aTableView tableColumnWithIdentifier:@&quot;popup&quot;] row:rowIndex]<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; // mise à  jour de l&#39;argument de sélection du datasource en fonction de la valeur du popup<br />&nbsp; &nbsp; &nbsp; &nbsp; [self setComboSelection:popupValue];<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; // chargement du combo<br />&nbsp; &nbsp; &nbsp; &nbsp; [(NSComboBoxCell *)aCell reloadData]<br />&nbsp; &nbsp; }<br />}<br />
    


    Ici, j'ai supposé que t'as implémenté une méthode setComboSelection: dans l'objet datasource du combo. Cette méthode permet de retourner la liste du combo spécifique à  cette sélection.
    Les 2 datasources (NSTableView et NSComboBox) sont self (le même objet qui implémente le delegate) : à  modifier si les datasources sont dans d'autres objets.

    D'autre part, la colonne contenant le pop a un identifiant "popup", et celle du combo "combo".

    J'espère que ça marchera.

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