PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → [WM17] IOS - désactiver correcteur orthographe sur champ de saisie
[WM17] IOS - désactiver correcteur orthographe sur champ de saisie
Débuté par Franck BASSIN, 27 juil. 2012 17:56 - 22 réponses
Posté le 27 juillet 2012 - 17:56
Bonjour,

J'ai dans mon application IOS un champ de saisie qui permet de filtrer les éléments d'une zone répétée.
Quand je tape "sav", il me remplace par "sac" si je fais "rechercher" par le bouton clavier.

Je souhaiterais désactiver le correcteur orthographe de l'Iphone sur ce champ.
Est-ce possible ?

Merci
Posté le 30 juillet 2012 - 16:20
Non, apparemment pas disponible actuellement.
La demander au ST pour l'avoir peut être en 18.
Posté le 30 juillet 2012 - 16:21
Salut Franck,

tu vas dans réglages -> géneral -> clavier -> autocorrection.

Cordialement,
Joseph.
Posté le 30 juillet 2012 - 16:46
Oui mais dans le cas présent, je veux juste le désactiver pour ce champ et pas pas pour toutes les apps de l'IPhone...
Posté le 31 juillet 2012 - 10:28
Je me réponds à moi-même : j'ai trouvé sur un forum la solution en objective C :

UITextField* f = [[UITextField alloc] init];
f.autocorrectionType = UITextAutocorrectionTypeNo;


Je sais qu'il est possible de saisir du code Objective C dans WM mais un spécialiste pourrait-il me dire ou coder ces 2 lignes ?

Merci de votre aide
Membre enregistré
56 messages
Posté le 31 juillet 2012 - 11:19
Le truc c'est de prendre en compte un champs Windev et lui modifier des caractéristiques en Objective-c.

Personnellement je tenterais la chose suivante.

Créer une procédure en Objective-c qui aurait comme code :
void IOS_AutoCorrection(void *CurrentField)
{
CurrentField.autocorrectionType=UITextAutocorrectionTypeNo;
}


Puis en Windev à l'initialisation de la fenêtre comprenant le champs.
SI PAS EnModeTest() ALORS
IOS_AutoCorrection(Handle(VOTRECHAMPSWD))
FIN


Etant donnée que la première ligne sert à allouer de la mémoire et l'initialiser.
Pourquoi le "SI PAS EnModeTest()", tout simplement que ce bout de code ne fonctionnera que sur l'iPhone.

Je vous demanderais si vous testez ceci, de nous envoyer le retour. De mon côté je vais vérifier le fonctionnement aussi mais plus tard dans la journée.
Posté le 31 juillet 2012 - 15:40
Merci de ta réponse
J'ai essayé ta solution mais cela ne compile pas dans XCode !
Semantic issue : Member reference base type 'void' is not a structure or union
Membre enregistré
56 messages
Posté le 01 août 2012 - 12:02
Rajoutez dans la fonction globale objective-c et au dessus du void pour voir :
// Imports et includes
#import <UIKit/UIKit.h>
Membre enregistré
950 messages
Popularité : +11 (13 votes)
Posté le 01 août 2012 - 13:12
Bonjour,

Il semblerait que le probleme void vienne de la declaration du handle ?
Void *CurrentFiels est-elle la bonne syntaxe ?

Vincent

Ps : si vous avez aussi du code pour selectionner le texte du champ, je duis preneur :)
Posté le 01 août 2012 - 13:42
J'avais déjà pensé à rajouter l'import mais ça ne résout pas le problème...
Posté le 02 août 2012 - 10:28
Bon alors, j'essaie d'avancer par tâtonnement...

Le code suivant compile maintenant dans XCode :
void IOS_AutoCorrection(void* nHandleChampWM)
{
UITextField* ChampWM = (UITextField*)nHandleChampWM;
IF (ChampWM) {
ChampWM.autocorrectionType=UITextAutocorrectionTypeNo;
}
}


Mais cela ne fonctionne pas !

Dans la trace d'XCode, il m'affiche le log suivant en exécution :

[CIOSGenericScrollDispatcher setAutocorrectionType:]: unrecognized selector sent to instance 0x14d4d50
Membre enregistré
950 messages
Popularité : +11 (13 votes)
Posté le 02 août 2012 - 10:48
Bonjour,

J'ai fait la même chose mais avec UITextView ( champ multilingue), ça ne marche pas non plus et même message d'erreur.

J'ai aussi essayé décrire dans le champ, ça ne marche pas.
Le handle renvoyé par WM est-il le bon ? Peut-être est-ce celui de la fenêtre et non du champ.

Ob
Posté le 02 août 2012 - 12:07
Effectivement, je soupçonne également que ce soit la fonction Handle() qui pose problème !

J'ai soumis un ticket au ST pour voir ce qu'il en est...

D'autre développeurs ont-ils déjà utilisé la fonction Handle avec un champ de saisie ??
Posté le 02 août 2012 - 12:37
La doc de WM précise bien que la fonction Handle retourne uniquement le UIView associé à la fenêtre.

Mais il doit-être possible de retrouver un champ précis de type UITextField parmi les subviews de la fenêtre ?

Je vais poursuivre dans cette voie...
Membre enregistré
56 messages
Posté le 02 août 2012 - 13:33
Le handle renvoi l'id du champs.
Donc il faut taper le code dans Obj-C comme si vous aviez uniquement l'id et non pas le nom de la variable declaré.
Essayer dans le code ObjetiveC :
void IOS_AutoCorrection(void *CurrentField)
{
[CurrentField UITextAutocorrectionTypeNo];
}
Posté le 02 août 2012 - 16:24
Bon, j'ai finalement trouvé la solution !

1 - il faut bien utiliser la fonction Handle avec le nom du champ de saisie.
Donc par exemple, il faut appeler la procédure IOS_AutoCorrection de cette manière dans le traitement d'initialisation du champ :
IOS_AutoCorrection(Handle(champSaisie))


2 - Ensuite, dans la procédure Objective C IOS_AutoCorrection, il faut faire :
void IOS_AutoCorrection(void* nHandleChampWM)
{
// Récupère le UIView
UIView* ChampWM = (UIView*)nHandleChampWM;
IF (ChampWM) {
// Parcourt des subviews de type UIView
for (UIView *view IN [ChampWM subviews]) {
// Si la classe de l'objet est UITextField
IF ([view isKindOfClass:[UITextField class]]) {
UITextField *textField = (UITextField *)view;
textField.autocorrectionType = UITextAutocorrectionTypeNo;
}
}
}
}


En fait le premier UIView récupéré n'est pas un UITextField.
Il faut parcourir les subviews pour trouver le bon.
J'imagine que c'est lié au framework développé par PCSoft qui encapsule les objets natifs dans leurs propres objets.

Il y a certainement moyen d'optimiser ce code (je ne suis pas spécialiste Objective C) mais en tout cas, il fonctionne..

Au passage, il existe également la propriété autocapitalizationType qui permet en fonction de la valeur de paramétrer la gestion des majuscules dans le champ.
Le code suivant permet par exemple, de ne pas avoir par défaut le CAPSLOCK enfoncé :
textField.autocapitalizationType = UITextAutocapitalizationTypeNone;


Bon dev
Membre enregistré
950 messages
Popularité : +11 (13 votes)
Posté le 02 août 2012 - 16:33
Désolé, ça ne marche pas non plus et il y a n :
Revivre type void Is ont id or interface pointer, considère casting it to id
Membre enregistré
950 messages
Popularité : +11 (13 votes)
Posté le 02 août 2012 - 16:34
Mon messag est passe avant la proposition de nouvelle solution !
Membre enregistré
950 messages
Popularité : +11 (13 votes)
Posté le 02 août 2012 - 16:57
Encore merci,

Mais de mon côté sa crie au niveau du for, je ne sais pas s'il manquen un crochet ou un point virgule ou autre ....


Ob
Membre enregistré
950 messages
Popularité : +11 (13 votes)
Posté le 02 août 2012 - 17:09
C'est ok, encore merci pour ton code !
Le IN doit être en minuscule : in

De mon côté, j'utilise UITextView et ça marche bien ....

Merci

Ob
Posté le 02 août 2012 - 17:52
J'ai l’impression que c'est la balise code qui met tous les mots clés en majuscule.
Il doit croire que c'est du code Windev....
Membre enregistré
56 messages
Posté le 02 août 2012 - 19:40
Haaaaaaaaaaaaaaaaaaa, Franck BASSIN merci beaucoup, depuis que j'ai lu ton code, beaucoup de chose m'ont parut clair et depuis je peux apporter mes codes objective-c et répondre a des problèmes (comme les erreurs d'accès mémoire sur les champs HTML ou les champs FenêtreInternes ou encore la gestion des ascenseurs).

D'ailleurs en objective-c, si vous faites un NSLog(@"%@",[UnHandleDeChamps description]); Vous pourrez vous rendre compte que le type est une frame. Ce qui signifie que Windev créer pour chaque Objet une frame et ajoute en subview l'objet.
Je m'explique :

Si vous créez un champsHTML dans xCode cela serait représenter par un UIWebView. Seulement Windev Créer une frame de la taille du champs et ajoute dedans une UIWebView.

Dans notre cas présent pourquoi ça ne marché pas. Tout simplement parceque nous essayons de mettre l'attribut pour arrêter la correction automatique sur une frame au lieu du champs, il suffit juste de descendre d'un niveau. Donc nous pouvons simplifiez le code.

Merci encore.
Membre enregistré
155 messages
Posté le 04 mai 2014 - 15:17
Merci également :) Ca m'a permis de comprendre un peu plus la liaison WL <=> ObjC.