webentwicklung-frage-antwort-db.com.de

Cursorposition in UITextField steuern

Ich habe eine UITextField, für die ich die Formatierung erzwinge, indem ich den Text im Änderungsbenachrichtigungs-Handler ändere. Dies funktioniert großartig (sobald ich die Probleme mit dem Wiedereintritt gelöst habe), hinterlässt ich jedoch ein weiteres nörgelndes Problem .. Wenn der Benutzer den Cursor an eine andere Stelle als das Ende der Zeichenfolge bewegt, wird er durch meine Formatierungsänderung an das Ende der Zeichenfolge verschoben. Dies bedeutet, dass Benutzer nicht mehr als ein Zeichen in die Mitte des Textfelds einfügen können. Gibt es eine Möglichkeit, die Cursorposition in der UITextField zu merken und dann zurückzusetzen?

47
Jeremy

Das Kontrollieren der Cursorposition in einem UITextField ist kompliziert, da so viele Abstraktionen mit Eingabefeldern und Positionsberechnungen verbunden sind. Es ist jedoch durchaus möglich. Sie können die Member-Funktion setSelectedTextRange verwenden:

[input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]];

Hier ist eine Funktion, die einen Bereich nimmt und die Texte in diesem Bereich auswählt. Wenn Sie den Cursor nur auf einen bestimmten Index setzen möchten, verwenden Sie einfach einen Bereich mit der Länge 0:

+ (void)selectTextForInput:(UITextField *)input atRange:(NSRange)range {
    UITextPosition *start = [input positionFromPosition:[input beginningOfDocument] 
                                                 offset:range.location];
    UITextPosition *end = [input positionFromPosition:start
                                               offset:range.length];
    [input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]];
}

Um zum Beispiel den Cursor auf idx im UITextField input zu setzen:

    [Helpers selectTextForInput:input 
                        atRange:NSMakeRange(idx, 0)];
66
Chris R

Nützlich, um an Index (Swift 3) zu positionieren

private func setCursorPosition(input: UITextField, position: Int) {
    let position = input.position(from: input.beginningOfDocument, offset: position)!
    input.selectedTextRange = input.textRange(from: position, to: position)
}
4
George Muntean

Ich habe endlich eine Lösung für dieses Problem gefunden! Sie können den gewünschten Text in das System-Pasteboard einfügen und an der aktuellen Cursorposition einfügen: 

[myTextField paste:self]  

Ich habe die Lösung auf dem Blog dieser Person gefunden:
 http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html

Die Funktion zum Einfügen ist spezifisch für OS V3.0, aber ich habe es getestet und funktioniert mit einer benutzerdefinierten Tastatur für mich. 

Wenn Sie sich für diese Lösung entscheiden, sollten Sie wahrscheinlich den Inhalt der Zwischenablage des Benutzers speichern und unmittelbar danach wiederherstellen.

3
Dan J

Hier ist die Swift-Version von @Chris R. - für Swift3 aktualisiert

private func selectTextForInput(input: UITextField, range: NSRange) {
    let start: UITextPosition = input.position(from: input.beginningOfDocument, offset: range.location)!
    let end: UITextPosition = input.position(from: start, offset: range.length)!
    input.selectedTextRange = input.textRange(from: start, to: end)
}
2
gabuchan

Verwenden Sie diese UITextField-Kategorie, um die Cursorposition abzurufen und festzulegen:

@interface UITextField (CursorPosition)

@property (nonatomic) NSInteger cursorPosition;

@end

-

@implementation UITextField (CursorPosition)

- (NSInteger)cursorPosition
{
    UITextRange *selectedRange = self.selectedTextRange;
    UITextPosition *textPosition = selectedRange.start;
    return [self offsetFromPosition:self.beginningOfDocument toPosition:textPosition];
}

- (void)setCursorPosition:(NSInteger)position
{
    UITextPosition *textPosition = [self positionFromPosition:self.beginningOfDocument offset:position];
    [self setSelectedTextRange:[self textRangeFromPosition:textPosition toPosition:textPosition]];
}

@end
1
Pavel Alexeev

Ich glaube nicht, dass es eine Möglichkeit gibt, den Cursor an einer bestimmten Stelle in Ihrer UITextField zu platzieren (es sei denn, Sie wurden sehr schwierig und simulierten ein Berührungsereignis). Stattdessen würde ich die Formatierung behandeln, wenn der Benutzer beendet seinen Text (in textFieldShouldEndEditing:) bearbeitet hat. Wenn der Eintrag falsch ist, darf das Textfeld die Bearbeitung nicht beenden.

0
pix0r