2009-08-23 4 views
12

J'ai plusieurs UITextFields dans UITableView. L'utilisateur ne devrait pouvoir insérer que des chiffres et des points. Pour ce faire, j'ai mis le type de clavier à UIKeyboardTypeNumberPad et ajouté un bouton '.' Dans le coin inférieur gauche. Chaque fois que le bouton est pressé, une fonction est appelée. Cette fonction devrait insérer un point à la position actuelle du curseur, mais c'est le problème: UITextField n'a pas de propriété selectedRange, donc je ne suis pas capable d'obtenir la position actuelle du curseur. Est-ce que quelqu'un sait comment résoudre ce problème ou existe-t-il un autre moyen de le faire? Merci.Chaîne d'insertion à la position du curseur de UITextField

Répondre

33

J'ai enfin trouvé une solution à ce problème! Vous pouvez mettre le texte que vous avez besoin d'insérer dans le système de carton, puis le coller à la position actuelle du curseur:

[myTextField paste:self] 

J'ai trouvé la solution sur le blog de cette personne:
http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html

La fonctionnalité de pâte est OS V3.0 spécifique, mais je l'ai testé et cela fonctionne très bien pour moi avec un clavier personnalisé.

Mise à jour: Selon le commentaire de Jasarien ci-dessous, il est conseillé de sauvegarder d'abord le contenu du carton et de le restaurer par la suite. Pour plus de commodité, voici mon code:

// Get a reference to the system pasteboard 
    UIPasteboard* lPasteBoard = [UIPasteboard generalPasteboard]; 

    // Save the current pasteboard contents so we can restore them later 
    NSArray* lPasteBoardItems = [lPasteBoard.items copy]; 

    // Update the system pasteboard with my string 
    lPasteBoard.string = @"-"; 

    // Paste the pasteboard contents at current cursor location 
    [myUIField paste:self]; 

    // Restore original pasteboard contents 
    lPasteBoard.items = lPasteBoardItems; 

    [lPasteBoardItems release]; 
+0

C'est ce que la question a réellement demandé. Et, et une excellente solution. – oberbaum

+5

Ceci est une excellente solution. Cependant, cela peut valoir la peine de mentionner ici que vous devez sauvegarder le contenu du carton de l'utilisateur avant de mettre votre contenu sur la table de montage, puis restaurer le contenu de l'utilisateur par la suite. De cette façon, ils n'ont aucune idée que vous avez utilisé la table de montage et que votre code est un bon citoyen en n'obstruant pas le contenu de la table de montage de l'utilisateur. – Jasarien

+0

Cette solution est incompatible avec VoiceOver. Au lieu de parler le personnage inséré, il dit simplement "Coller". –

0

Lire la valeur du champ de texte sous la forme d'une chaîne lorsque vous appuyez sur votre bouton. Modifiez la chaîne, puis définissez la valeur du champ sur la nouvelle chaîne.

+0

ouais mais le fait est qu'il ne sait pas comment il veut modifier la chaîne. il veut insérer un point où se trouve le curseur, mais il ne sait pas où se trouve le curseur. – newacct

+0

Cela n'introduirait pas de point à la position actuelle du curseur, juste à la fin de la chaîne. – WetFish

1

Si vous cherchez à créer des champs de texte qui vous permettent d'entrer dans décimales puis-je suggérer que vous fixer plutôt le point décimal à une certaine précision et permettre à l'utilisateur d'entrer des numéros comme suit:

En supposant que votre la précision est de 2 chiffres après la virgule:

start: value is 0.00 
user enters 1: value is 0.01 
user enters 2: value is 0.12 
user enters 3: value is 1.23 
user enters 4: value is 12.34 

Affichez What is the best way to enter numeric values with decimal points? pour une solution similaire pour la monnaie.

C'est une solution de loin plus simple que de créer un clavier personnalisé et de gérer toutes les nuances que présente cette approche. Si, toutefois, vous avez besoin d'une précision de longueur variable, cette approche peut mieux vous convenir.

+0

Merci. Je pense que c'est le meilleur moyen. – WetFish

2

Il y a maintenant un clavier de type pavé numérique fantastique qui comprend un point décimal, aucune configuration nécessaire, sauf réglage (pas IB, pas une option encore là) les UITextField « s keyboardType propriété à UIKeyboardStyleDecimalPad, comme ceci:

textField.keyboardType = UIKeyboardTypeDecimalPad; 

Cela fait tous les trucs de fantaisie que vous avez essayé de le faire automatiquement.

2

Swift

Ce texte insère à la position du curseur.

textField.insertText("Hello") 

Ma réponse complète à travailler avec la position du curseur est here.

Questions connexes