NSSearchField

GGGG Membre
20:59 modifié dans API AppKit #1
Bonjour à  tous,
dans une application, j'ai une NSSearchField, mais j'aimerai savoir s'il existe un moyen de savoir si la stringValue a été modifiée en dehors de la fonction qui effectue la IBAction ?



Réponses

  • schlumschlum Membre
    20:59 modifié #2
    Deux solutions pour le prix d'une :

    - Utiliser le "delegate"
    - (void)controlTextDidChange:(NSNotification *)aNotification
    


    - Sous-classer NSSearchField
    - (void)textDidChange:(NSNotification *)aNotification
    
  • GGGG Membre
    20:59 modifié #3
    En fait, c'est lors du chargement des données dans une NSTableView que j'aimerai faire ce test, pour arrêter le chargement.
    Existe t'il une méthode qui retourne juste un booléen ?
    Car textDidChange retourne void :(.
  • BruBru Membre
    20:59 modifié #4
    dans 1199368963:

    En fait, c'est lors du chargement des données dans une NSTableView que j'aimerai faire ce test, pour arrêter le chargement.
    Existe t'il une méthode qui retourne juste un booléen ?
    Car textDidChange retourne void :(.


    Attends, je doute que l'utilisation du delegate ou de la notification te soient utiles si c'est pour interrompre le "chargement" d'un NSTableView.

    Et ceci pour 2 raisons :
    - un NSTableView, ça ne se charge pas.
    - l'affichage du contenu d'un NSTableView via son datasource se fait (plus que probablement) dans une boucle qui ne sera pas interrompue par la notification ou par l'appel du delegate.

    Précise ce que tu veux faire plus précisément.

    .
  • 20:59 modifié #5
    Je comprend pas ce que tu veux faire exactement ?

    Grillé par Bru, merci.. :p
  • GGGG Membre
    20:59 modifié #6
    Oui effectivement, il vaut mieux que je remonte dans le code :).

    En gros la NSSearchField envoie une requête spotlight et le résultat s'affiche dans une nstableview.
    Le hic c'est que la requête me renvoie des NSString qui me permettent de créer mes propres objets, et qui servent à  l'affichage de la NSTableView.

    Le truc c'est que le seul moyen que j'ai trouvé pour éviter  des exceptions, est de créer mes objets dans  "- (id)tableView:(NSTableView *)aTableView
    objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex"
    Mais je les crée dés la première entrée dans cette méthode.
    En gros
    <br />MDItemRef item;<br />		NSString *_path;<br />		int i;<br />		int max = MDQueryGetResultCount(_query);<br />		int start = [_tableValues count] -1 ;<br />		if ( start &lt; 0 )<br />			start = 0;<br />		for ( i = start ; i&lt;max ; i++ ) {<br />			item = (MDItemRef)MDQueryGetResultAtIndex(_query,i);<br />			if ( NULL != item ) {<br />				_path = (NSString*)MDItemCopyAttribute(item, CFSTR(&quot;kMDItemPath&quot;));<br />				NSLog(@&quot;Value exists in filespath with value:%@&quot;,_path);<br />				MYObj *_obj = [[MYObj alloc]initWithPath:_path];<br />				[_tableValues insertObject:_obj atIndex:i];<br />				[_path release];<br />			}<br />		} <br /><br />
    

    Autrement je ne sais pas comment faire pour charger au fur et à  mesure mon NSMutableArray _tableValues.
    Et le soucis est que si la requête retourne un grand nombre de résultat, le temps que cette boucle charge tout en mémoire, les modifications de ma NSSearchField ne sont pas pris en compte tout de suite.
    L'idée était d'ajouter un test dans cette boucle qui teste l'état de la NSSearchField et si elle est modifiée, arrêté la boucle.
  • 20:59 modifié #7
    Le plus simple c'est de faire comme Spotlight lui même non ?
    Sur spotlight tu vois bien que tu peux taper taper et taper dans la recherche ça se charge toujours.
    Pour éviter que ton programme bloque, tu détaches un nouveau thread, un sous-programme si tu préfères.
    Dans ce thread, tu t'occupes d'effectuer le trie.

    Si ta recherche abouti à  des fichiers, tu les rajoutes tout simplement dans ta array que tu retourne à  chaque fois à  ta tableview.
    Il faudra juste la vider à  chaque fois au début du chargement et arrêter l'ancien thread qui s'occupait de la recherche précédente.

    Sinon tu peux faire une vraie recherche continue mais dans ce cas ça devient compliquer car il faudra supprimer les éléments qui ont été ajoutés mais qui ne correspondent plus à  la nouvelle recherche, ainsi que supprimer les doublons
  • schlumschlum Membre
    20:59 modifié #8
    Si "numberOfRowsInTableView" est bien réglé, pas de raison qu'il y ait d'exceptions...
    Elle ne doit jamais renvoyer un nombre supérieur à  la taille de ton "_tableValues"

    De plus, tant qu'il n'y a pas de scroll ou autre actions sur la tableView ou un appel à  "reloadData", tu peux y toucher sans que l'affichage ne change.

    J'ai du mal à  voir le problème.
  • GGGG Membre
    20:59 modifié #9
    Merci à  toi schlum, car je viens de m'apercevoir qu'il y avait une erreur au niveau de cette méthode.
    Par contre à  quel moment tu effectues le remplissage de la NSMutableArray qui contient l'objet à  afficher dans la NSTableView ?

  • AliGatorAliGator Membre, Modérateur
    20:59 modifié #10
    Ben heu... dans le textDidChange, comme mentionné plus haut, non ?

    Ou plus exactement et idéalement dans la méthode de ton thread (que tu auras détaché pour séparer le processus de recherche du thread principal) qui trouve les résultats ; thread qui sera lancé lors du textDidChange, et arrêté quand la recherche est terminée, ou qu'un autre textDidChange survienne entre temps, interrompant le thread de recherche en cours pour en lancer un nouveau avec le nouveau critère de recherche.
  • GGGG Membre
    20:59 modifié #11
    Je viens d'effectuer la manip suivante :
    - créer un thread pour créer ma class :
    <br />- (void)loadOYASearchImageThreaded:(NSString*)_path {<br />	NSAutoreleasePool* pool =[[NSAutoreleasePool alloc]init];<br />	MonObjt *_obj = [[MonObjt alloc]initWithPath:_path];<br />	[_tableValues addObject:_obj];<br />	[_path release];<br />	[self performSelectorOnMainThread:@selector(reloadData) withObject:self waitUntilDone:YES];<br />	[pool release];<br />	[NSThread exit];<br />}<br /><br />
    


    ET ça fonctionne bien, mais comment l'arrêter lorsque une nouvelle requête arrive ?
  • schlumschlum Membre
    20:59 modifié #12
    Manque déjà  le "release" de "_obj"  ;)

    Pour le reste, c'est une bonne question, qui a été déjà  plus ou moins traitée ici.
    Recherche "thread" dans les titres des sujets du forum...
  • janvier 2008 modifié #13
    Hello, je me suis un peu amusé ce matin et j'ai fait mon premier project sur xCode 3 !
    Voici un petit exemple de ce que je pense tu cherches à  faire : http://mic3d.free.fr/TbVSearch.zip

    Exemple à  critiquer bien sur !

    Edit - c'est certainement plus malin (cocoa) d'utiliser NSMetadataQuery et ses copains en fait...
Connectez-vous ou Inscrivez-vous pour répondre.