2009-09-30 10 views
45

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

+3

Schnelle Antwort über das Abrufen und Setzen der Cursorposition und das Einfügen von Text. http://StackOverflow.com/a/34922332/3681880 – Suragch

Antwort

0

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.

+3

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

3

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.

+1

Dies sollte die akzeptierte Antwort sein. – banDedo

+13

Ändern Sie die Zwischenablage des Benutzers? Das scheint etwas zu sein, das mich verrückt machen würde. Können Sie die Zwischenablage wiederherstellen, wenn Sie damit fertig sind? – colinta

64

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)]; 
+0

Gut gemacht. das funktioniert bei mir und ist flexibel. – LostInTheTrees

+0

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

+1

Sorry aber es funktioniert nicht, der Cursor bleibt am Ende ... iOS 8.0 hier. –

-2

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]; 
} 

Source from @omz

2

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) 
} 
0

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 
4

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) 
}