Ottenere la posizione del cursore di UITextField in ios

Sto cercando di controllare la posizione del cursore nel UITextField. Gli utenti non possono inserire più di un carattere alla volta in mezzo al campo di testo. Si sposta alla fine del textfield. Quindi questo post in questo MODO: Controllo della posizione del cursore in UITextField risolve il mio problema. Ma ho bisogno di sapere la posizione corrente del cursore.

Mio codice simile a questo:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
   if (textField.tag == 201) 
   {
     [myclass selectTextForInput:textField atRange:NSMakeRange(idx, 0)];
   }
}

È mi dà un errore alla idx. Come faccio a trovare che?

InformationsquelleAutor lakesh | 2013-05-08



4 Replies
  1. 27

    UITextField è conforme alla UITextInput protocollo che ha i metodi per ottenere la selezione corrente. Ma i metodi sono complicate. Avete bisogno di qualcosa come questo:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
        if (textField.tag == 201) {
            UITextRange *selRange = textField.selectedTextRange;
            UITextPosition *selStartPos = selRange.start;
            NSInteger idx = [textField offsetFromPosition:textField.beginningOfDocument toPosition:selStartPos];
    
            [myclass selectTextForInput:textField atRange:NSMakeRange(idx, 0)];
        }
    }
    • poi come si assicurarsi che il cursore rimane nella stessa posizione dopo l’eliminazione di un personaggio in uitextfield?
  2. 5

    Swift versione

    if let selectedRange = textField.selectedTextRange {
    
        let cursorPosition = textField.offsetFromPosition(textField.beginningOfDocument, toPosition: selectedRange.start)
        print("\(cursorPosition)")
    }

    La mia risposta su come ottenere e impostare la posizione del cursore è qui.

  3. 3

    Il codice che hai postato non funziona per determinare il punto in cui è posizionato il cursore. È necessario il metodo get, non l’insieme. Dovrebbe essere qualcosa lungo le linee di:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
       if (textField.tag == 201) 
       {
             UITextRange selectedRange = [textField selectedTextRange];
             //here you will have to check whether the user has actually selected something
             if (selectedRange.empty) {
                  //Cursor is at selectedRange.start
                  ...
             } else {
                  //You have not specified home to handle the situation where the user has selected some text, but you can use the selected range and the textField selectionAffinity to assume cursor is on the left edge of the selected range or the other
                  ...
             }
       }
    }

    Per ulteriori informazioni – controllare il UITextInput protocollo http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UITextInput

    Aggiorna: @rmaddy ha inviato alcuni buoni extra bit che ho perso nella mia risposta – come gestire la posizione del testo dal NSTextRange e la conversione NSTextPosition int.

    • poi come si assicurarsi che il cursore rimane nella stessa posizione dopo l’eliminazione di un personaggio in uitextfield..
    • Non è possibile garantire che. Per cancellare il carattere, in primo luogo, si dovrà impostare l’intero contenuto del campo. Che inevitabilmente spostare il cursore alla fine. Si dovrà quindi impostare la posizione che ti piace.
  4. 0

    Swift Soluzione.

    È possibile impostare il cursore, imbottitura da una sottoclasse della UITextfield di classe e di applicazione di questi due metodi.

    Speranza che aiuta qualcuno in difficoltà.

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: UIEdgeInsets.init(top: 4, left: 40, bottom: 1, right: 15))
    }
    
    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: UIEdgeInsets.init(top: 4, left: 40, bottom: 1, right: 15))
    }

Lascia un commento