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?
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)];
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)
}
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.
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)
}
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
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.