NSSearchfield et vitesse d'exécution
chaps31
Membre
Bonjour à tous,
Juste une question, j'utilisais un NSSearchField via sa méthode delegate héritée :
Puis je me suis dis, quand même c'est un control fait pour être utilisé en target-action. Donc j'ai créé un IBAction et j'y ai mis le code qui se trouvait dans la méthode délégué précédente, j'ai viré le delegate dans IB et mis un lien pour l'action.
Ca marche évidement pareil sauf que à ma grande surprise, c'est moins rapide... L'action entraine un
La méthode délégué est réellement plus rapide ??? C'est étrange... Car si là c'est pour une fraction de seconde, lorsqu'il y aura plus de 1000 lignes..
Votre expérience dans la vitesse de
Merci de vos lumières .
Juste une question, j'utilisais un NSSearchField via sa méthode delegate héritée :
- (void)controlTextDidChange:(NSNotification *)aNotification
Puis je me suis dis, quand même c'est un control fait pour être utilisé en target-action. Donc j'ai créé un IBAction et j'y ai mis le code qui se trouvait dans la méthode délégué précédente, j'ai viré le delegate dans IB et mis un lien pour l'action.
Ca marche évidement pareil sauf que à ma grande surprise, c'est moins rapide... L'action entraine un
filterUsingPredicate
sur un tableau source d'une tableview. Ce tableau ne contient actuellement que 15 lignes (en utilisation réelle il y a aura peut-être 5000 lignes) et si via la méthode délégate hérité c'est instantané, via l'IBAction il y a un très court temps de latence (< à 1 sec.)... La méthode délégué est réellement plus rapide ??? C'est étrange... Car si là c'est pour une fraction de seconde, lorsqu'il y aura plus de 1000 lignes..
Votre expérience dans la vitesse de
- (void)controlTextDidChange:(NSNotification *)aNotification
par rapport au target-action ?Merci de vos lumières .
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
EDIT : Une autre remarque, je viens de découvrir un truc, c'est qu'avec la méthode délégué effacer un caractère dans le searchfield lance la méthode mais pas avec l'IBAction... Cette dernière ne se lance que lorsque l'on tape un caractère... Vous confirmez ? Si c'est le cas j'abandonne l'IBAction.
Il faudrait voir si le temps de latence que tu remarques n'est pas simplement ce temps de frappe de la touche Enter , et peut-être aussi essayer de profiter dans ton code des appels multiples, en filtrant des tableaux déjà filtrés .
D'ailleurs ma tableview se modifie à chaque frappe clavier sans que continuous ne soit coché, cela n'arrive plus si je coche "Send Whole Search String". Continuous semble servir à autre chose.
Donc l'action et la méthode délégué font rigoureusement la même chose, bizarre ce délai avec l'action par rapport à la méthode délégué.
Comme tu le dis je peux améliorer mon code, mais de toute manière la méthode délégué sera toujours plus rapide et reste le problème de l'effacement pris en compte par la méthode délégué et pas par l'action... Je sens que je vais repasser en méthode délégué... Une autre idée pour ce ralentissement avec l'action et pour les effacements non pris en compte ?
Merci de tes réponses.
Déjà parcourue, mais j'y retourne.
EDIT : pour l'effacement, erreur de code de ma part, plus de problème. :)beta:
Pour la vitesse mystère, c'est une curiosité.
Sinon, puisque je suis sur les searchfield, j'ai beau chercher je n'arrive pas à activer le menu du searchfield, je le crée pas de problème, mais par contre toutes les item restent grisées... :-\\
Non je ne confirme pas, l'IBAction est lancé à l'effacement d'un caractère, et à l'effacement total.
Merci encore pour tes réponses et ton test sur la vitesse. Sinon... Je ne voudrais pas abuser... ::) Mais tu sais comment rendre les menus des nssearchfield actif, non grisés ? Merci :why?:
Il y a une manip spéciale pour faire apparaà®tre ce menu ?
La réponse à ton problème est en encadré page 14 du Search Fields Guide : Mettre 1001 dans le tag de l'item du menu, pour les autres options d'un tel menu, mettre 1000, 1002, 1003.
J'ai plusieurs NSSearchfield, plusieurs auront des menus, dans le premier que j'essaie de créer il y a 3 item "supérieur à " "inférieur à " et "egal à ", en fonction de l'item sélectionnée dans xcode la comparaison changera et entrainera un filtre dans un tableau en datasource d'une tableview.
En fait je ne suis pas certains de bien comprendre.. :)beta: pour moi les items des menus sont les choix possible, donc qu'entends-tu par "l'item du menu", j'en ai 3... J'ai essayé de leur mettre les tag 1001 - 1002 - 1003, 1000-1002-1003 même résultat dans les 2 cas et que je ne comprend pas, un seul choix apparait le 1003 et toujours en grisé... :crackboom:-
[EDIT] si je mets deux item de tag 1001, j'ai le droit à un doublement , soit 10 items.
J'insère en haut un item avec pour titre "Recherches Récentes", et tag=1000
Dans mon cas il s'agit d'un trie de tableau en fonction de la valeur chiffrée rentrée dans le champs de recherche, mais le trie doit pouvoir s'exécuter pour >, < ou =. Je pensais utiliser ce menu pour permettre ce choix, malheureusement j'ai l'impression que ce n'est pas possible...
Tant pis... je vais passer par une autre voie moins ergonomique, taper > ou < avant le nombre dans la case de recherche...
Mais pour un autre nssearchfield je vais utiliser les items de dernières recherches, merci
Dans le menu j'ai tapé pour l'item 1 "Eléments récents" avec tag 1000, Item2 non touchée sauf pour le tag (mis à 1001) et item3 "Effacer ce menu" avec tag 1002. Je compile, le petit triangle est présent et.....
rien... Aucun menu ne s'affiche... :crackboom:- Si tu vois une erreur évidente à ma description je suis preneur, pas au top ce système :P
Rien n'empêche à priori de rajouter un autre item avec une action (connection dans IB) qui change une variable d'instance dans ton contrôleur.
[EDIT] essai ==> aucun problème
Peut-être le choix d'un AutoSaveName (différent du premier) ?
[EDIT] essai : nouveau NSSearchField, copier-coller du premier menu, mise en place du delegate du search field, et code :
-(void) controlTextDidChange:(NSNotification*) notif {
NSLog(@control text did change);
NSPredicate * predicate=nil;
NSString * searchString=[[notif object] stringValue];
if(nil!=searchString && [searchString length]>0){
predicate=[NSPredicate predicateWithFormat:@%K BEGINSWITH %@",@nom,searchString];
self.filteredClients=[clients filteredArrayUsingPredicate:predicate];
}
}
Personnellement, je mettrais un segmented control à côté du champ de recherche.