Ich habe eine UITextField
, die ich erzwinge Formatierung, indem Sie den Text im Änderungsbenachrichtigungshandler ändern. Das funktioniert großartig (sobald ich die Reentrancy-Probleme gelöst habe), aber hinterlässt ein weiteres nörgelndes Problem. Wenn der Benutzer den Cursor an eine andere Stelle als das Ende der Zeichenfolge bewegt, verschiebt meine Formatierungsänderung ihn an das Ende der Zeichenfolge. Dies bedeutet, dass Benutzer nicht mehr als ein Zeichen gleichzeitig in die Mitte des Textfelds einfügen können. Gibt es eine Möglichkeit, sich zu erinnern und dann die Cursorposition in UITextField
zurückzusetzen?Cursorposition in UITextField steuern
Antwort
Ich glaube nicht, dass es eine Möglichkeit gibt, den Cursor an einer bestimmten Stelle in Ihrem UITextField
zu platzieren (es sei denn, Sie wurden sehr schwierig und simuliert ein Touch-Ereignis). Stattdessen würde ich formatieren, wenn der Benutzer fertig ihren Text bearbeiten (in textFieldShouldEndEditing:
) und wenn ihre Eingabe nicht korrekt ist, nicht zulassen, das Textfeld zu bearbeiten.
Ich hatte darüber nachgedacht, aber was ich implementiere ist ähnlich wie Sie Zahlen an einem Geldautomaten eingeben. Die Dezimalzahl ist immer da und wenn Sie Zahlen eingeben, bewegen sie sich nach links, so dass die Eingabe von 1-0-5-0 zuerst in 0,01, dann in 0,10, 1,05, 10,50 erfolgt. Um es am Ende zu tun würde 1050 im Feld erlauben und dann auf 10,50 ändern, was für den Benutzer eher verwirrend ist. – Jeremy
Ich habe endlich eine Lösung für dieses Problem gefunden! Sie können den Text setzen Sie in das System Einfügebereich eingefügt müssen und fügen Sie diesen dann an der aktuellen Cursorposition:
[myTextField paste:self]
ich die Lösung auf diese Person Blog gefunden:
http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html
Die Paste-Funktionalität OS V3.0 spezifisch, aber ich habe es getestet und es funktioniert gut für mich mit einer benutzerdefinierten Tastatur.
Wenn Sie sich für diese Lösung entscheiden, sollten Sie wahrscheinlich den vorhandenen Inhalt der Zwischenablage des Benutzers speichern und unmittelbar danach wiederherstellen.
Das Steuern der Cursorposition in einem UITextField ist kompliziert, weil so viele Abstraktionen mit Eingabefeldern und Berechnungspositionen verbunden sind. Es ist jedoch sicherlich möglich. Sie können das Funktionselement verwenden setSelectedTextRange
:
[input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]];
Hier ist eine Funktion, die eine Reihe nimmt und wählt die Texte in diesem Bereich. Wenn Sie nur den Cursor auf einem bestimmten Index platzieren möchten, verwenden Sie einfach einen Bereich mit 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]];
}
Zum Beispiel input
den Cursor an idx
im UITextField zu platzieren:
[Helpers selectTextForInput:input
atRange:NSMakeRange(idx, 0)];
Gut gemacht. das funktioniert bei mir und ist flexibel. – LostInTheTrees
Die allgemeine Idee ist ok, aber dieser Code möchte in einer Kategorie auf NSTextField, wie hier: https://github.com/MaxZeng/UITextField-SelectedRange/blob/master/UITextFieldSelectedRange/UITextField%2BSelection.m – osxdirk
Sorry aber es funktioniert nicht, der Cursor bleibt am Ende ... iOS 8.0 hier. –
Hier ist ein Ausschnitt, der für dieses Problem gut funktioniert:
- (void)textFieldDidBeginEditing:(UITextField *)textField{
UITextPosition *positionBeginning = [textField beginningOfDocument];
UITextRange *textRange =[textField textRangeFromPosition:positionBeginning
toPosition:positionBeginning];
[textField setSelectedTextRange:textRange];
}
Hier ist die Swift-Version von @Chris R.- aktualisiert swift3
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)
}
Fühlen Sie sich frei, diese UITextField
Kategorie zu verwenden, zu erhalten und setzen Cursorposition:
@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
Nützlich, um Position im Index (Swift 3)
private func setCursorPosition(input: UITextField, position: Int) {
let position = input.position(from: input.beginningOfDocument, offset: position)!
input.selectedTextRange = input.textRange(from: position, to: position)
}
Schnelle Antwort über das Abrufen und Setzen der Cursorposition und das Einfügen von Text. http://StackOverflow.com/a/34922332/3681880 – Suragch