Programmgesteuert Wählen Sie den gesamten Text in UITextField aus


Antworten:


59

Es stellt sich heraus, dass der Aufruf von -selectAll: bei einem Nicht-Null-Absender das Menü anzeigt. Wenn Sie es mit nil aufrufen, wird der Text ausgewählt, das Menü jedoch nicht angezeigt.

Ich habe dies versucht, nachdem mein Fehlerbericht von Apple mit dem Vorschlag zurückgekommen war, dass ich null statt selbst übergebe.

Sie müssen sich nicht mit UIMenuController oder anderen Auswahl-APIs herumschlagen.


3
Ich habe versucht herauszufinden, wie man den Text auswählt, ohne das Menü anzuzeigen. Vielen Dank, dass Sie dieses Leckerbissen hinzugefügt haben.
Erik

1
Scheint nicht für das Textfeld eines Alert-Controllers zu funktionieren.
Nicolas Miari

3
Vergiss es, für Alarm-Controller funktioniert diese Antwort: stackoverflow.com/a/35992115/433373
Nicolas Miari

1
+1 für die richtige Antwort. Ein weiteres +1 für die Erwähnung von Absender und Menü. Ein weiteres +1 für die Angabe der Informationsquelle. Leider habe ich nur eine Stimme ...
eonil

82

Das war der Trick für mich:

[self.titleField setSelectedTextRange:[self.titleField textRangeFromPosition:self.titleField.beginningOfDocument toPosition:self.titleField.endOfDocument]];

Ziemlich hässlich, aber es funktioniert, daher wird kein sharedMenuController angezeigt!

Verwenden Sie Folgendes, um das Problem "Funktioniert nur jedes zweite Mal" zu beheben:

__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    __strong __typeof(weakSelf) strongSelf = weakSelf;
    UITextRange *range = [strongSelf textRangeFromPosition:strongSelf.beginningOfDocument toPosition:strongSelf.endOfDocument];
    [strongSelf setSelectedTextRange:range];
});

Vielen Dank an Eric Baker (gerade bearbeitet von Kommentar hier)


3
Dies ist tatsächlich eine weit überlegene Antwort auf die Frage. Es macht das, was verlangt wird, ohne dumme Problemumgehungen, um zu verhindern, dass das Menü angezeigt wird (was für mich sowieso nicht funktioniert).
PKCLsoft

1
Es tut uns leid, dies zurückzubringen, aber Ihre Lösung funktioniert nur beim ersten Mal. Das zweite Mal schlug es fehl. Grundsätzlich habe ich festgestellt, dass Benutzer, die auf UITextField klicken, den gesamten Text auswählen, um ihn zu überschreiben, die Tastatur durch Klicken auf etwas anderes (in diesem Fall einen transparenten Hintergrund) schließen können, nachdem sie auf dasselbe UITextField geklickt haben mach den Trick noch. Wiederholen Sie diesen Vorgang. Ich stelle fest, dass er für die ungerade Zeit funktioniert, aber nicht für die gerade Zeit. Dh: arbeitet für den ersten, dritten, fünften; funktioniert nicht für den zweiten, vierten, sechsten.
LN

11
@LeonNguyen Dies funktioniert für mich, um das von Ihnen beschriebene Problem zu lösen: __weak typeof(self) weakSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ __strong __typeof(weakSelf) strongSelf = weakSelf; UITextRange *range = [strongSelf textRangeFromPosition:strongSelf.beginningOfDocument toPosition:strongSelf.endOfDocument]; [strongSelf setSelectedTextRange:range]; });
Eric Baker

@EricBaker Ich kann bestätigen, dass Ihre Lösung funktioniert hat. Es scheint ein Problem mit dem Threading zu sein. Danke
LN

1
Der __schwache / __starke Hack hat bei mir nicht funktioniert. Ich musste den gesamten Text bei endEditing abwählen, damit er beim startEditing frisch ausgewählt werden konnte.
Marsbear

48

Ich habe dies gerade getestet, um den obigen Kommentar von Mirko zu überprüfen, aber mein Test bestätigt, dass selectAll:tatsächlich der gesamte Text ausgewählt wird, wenn er an das UITextField selbst gesendet wird.

Beachten Sie, dass der Text mit CUT | sofort verdeckt wird KOPIEREN | PASTE-Aktionen, aber auf Ihre Frage wird genau das angezeigt, wenn ein Benutzer zunächst auf "Alle auswählen" tippt.

Beachten Sie, dass in der zweiten Zeile der Dialog CUT / COPY / PASTE vorübergehend ausgeblendet wird, ohne ihn für die explizite Benutzerauswahl zu deaktivieren

[_myTextField selectAll:self];
[UIMenuController sharedMenuController].menuVisible = NO;

Ich möchte den gesamten Text auswählen, wenn der Benutzer auf das UITextField tippt, damit der ursprüngliche Text gelöscht wird, sobald er mit der Eingabe beginnt. Welche Outlet-Aktion sollte ich aufrufen, um dies zu erreichen? Ich habe versucht, Touch-Up mit einer IBAction zu verknüpfen, die Ihren obigen Code aufruft, aber nicht funktioniert hat.
C0D3

Okay, ich habe es ohne Sorgen herausgefunden. Vielen Dank.
C0D3

Nur um Sie wissen zu lassen, dass es bei mir nicht funktioniert hat :( Das Menü ist immer noch nicht sichtbar, wenn wir anrufen, [UIMenuController sharedMenuController].menuVisible = NO;damit diese Zeile keine Wirkung hat.
Fábio Oliveira

3
Um den gesamten Text auszuwählen, damit das Menü nicht angezeigt wird, müssen Sie setSelectedRange:stattdessen verwenden.
Fábio Oliveira

47

Verwenden Sie, was Sie brauchen

ObjC

 [yourtextField becomeFirstResponder]; //puts cursor on text field

 [yourtextField selectAll:nil];  //highlights text

 [yourtextField selectAll:self]; //highlights text and shows menu(cut copy paste)

Schnell

yourTextField.becomeFirstResponder() //puts cursor on text field

yourTextField.selectAll(nil)  //highlights text

yourTextField.selectAll(self) //highlights text and shows menu(cut copy paste)

3
Beste Antwort hier. Super einfach, und der Null-Trick, um das Popup-Fenster Ausschneiden / Kopieren / Pate auszublenden, macht den Trick!
Marchy

1
Dies ist die beste / einfachste Antwort
Hackmodford

6
Hinweis: Wenn Sie beim ersten Anzeigen einer Ansicht Text auswählen möchten, müssen Sie den selectAllAnruf tätigen viewDidAppear. Es funktioniert nicht, wenn es in viewDidLoadoder platziert wird viewWillAppear.
Benjamin Martin

9

Dies ist die beste Lösung, die ich gefunden habe. Kein sharedMenuController, und es funktioniert nacheinander:

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    [textField performSelector:@selector(selectAll:) withObject:nil afterDelay:0.1];
}

Wenn Sie eine Antwort Jahre nach dem Stellen einer Frage hinzufügen, sollten Sie erklären, warum Sie noch eine weitere Antwort hinzufügen. Hier gibt es viele Antworten: Unter welchen Bedingungen ist Ihre Antwort "besser" als alle anderen? Was ist der Vorteil? Gibt es Situationen, in denen dies möglicherweise nicht vorteilhaft ist, und welche vorhandene Antwort würden Sie dann verwenden?
ToolmakerSteve

3
Vielen Dank! Dieser Ansatz, oder besser gesagt das Swift-Äquivalent "textField.perform (#selector (selectAll), with: nil, afterDelay: 0.01)", behebt das Problem, das Leon Nguyen mit der obigen Antwort von blackforestcowboy hatte, wo es nur jedes zweite Mal funktioniert. Etwas über das Verzögern der Aktion muss das Threading aussortieren. Wie @ToolmakerSteve sagt, wäre es nützlich, dies in der Antwort hier zu erklären.
Andy Mortimer

8

Schnell

Wählen Sie den gesamten Text in a UITextField:

textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)

Meine vollständige Antwort finden Sie hier: https://stackoverflow.com/a/34922332/3681880


Übrigens, wenn es ein Swift-Äquivalent zur kürzeren alternativen Lösung gibt [textField selectAll:nil], wäre es gut, dies auch aufzulisten.
ToolmakerSteve

Ja, wenn jemand es weiß, hinterlasse bitte einen Kommentar.
Suragch

3

Um Text auswählen zu können, muss das Textfeld bearbeitet werden können. Um zu wissen, wann das Textfeld bearbeitet werden kann, verwenden Sie die Delegatmethoden:

- (void)textFieldDidBeginEditing:(UITextField *)textField
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

Ich denke nicht, dass textFieldShouldBeginEditing: erforderlich ist, aber es ist das, was ich in meiner Implementierung verwendet habe.

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    [textField selectAll:textField];
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    return YES;
}

Wenn Sie nil an selectAll übergeben, wird das Menü nicht angezeigt.


2

Leider glaube ich nicht, dass du das kannst.

Ich bin nicht sicher, ob dies Ihnen hilft, aber setClearsOnBeginEditingSie können festlegen, dass der UITextFieldvorhandene Wert gelöscht werden soll, wenn der Benutzer mit der Bearbeitung beginnt (dies ist die Standardeinstellung für sicher UITextFields).



1

Ich erstelle eine benutzerdefinierte Warnansicht, die ein UITextFieldInneres enthält . Ich habe ein Problem mit dem Textfeld festgestellt: Es hat beginningOfDocumentnur Wert, wenn das Textfeld zum Bildschirm hinzugefügt becomeFirstResponderwird und aufgerufen wird.

Andernfalls wird beginningOfDocumentzurückgegeben nilund [UITextField textRangeFromPosition:]der Wert kann nicht abgerufen werden.

Hier ist mein Beispielcode, um diesen Fall zu lösen.

UIWindow *window = [[[UIApplication sharedApplication] windows] firstObject];
[window addSubview:theAlertView]; // textfield must be added as a subview of screen first
UITextField *textField = theAlertView.textField;
[textField becomeFirstResponder]; // then call to show keyboard and cursor 
UITextRange *range = [textField textRangeFromPosition:textField.beginningOfDocument toPosition:textField.endOfDocument]; // at this time, we could get beginningOfDocument
[textField setSelectedTextRange:range]; // Finally, it works!!!

0
UITextField *tf = yourTF;
// hide cursor (you have store default color!!!)
[[tf valueForKey:@"textInputTraits"] setValue:[UIColor clearColor]
                                       forKey:@"insertionPointColor"];
// enable selection
[tf selectAll:self];
// insert your string here
// and select nothing (!!!)
[tf setMarkedText:@"Egor"
    selectedRange:NSMakeRange(0, 0)];

Erledigt!


-1

Wenn Sie meinen, wie würden Sie dem Benutzer erlauben, den Text in einem uitext-Feld zu bearbeiten, dann weisen Sie ihm einfach firstResponder zu:

[textField becomeFirstResponder]

Wenn Sie meinen, wie erhalten Sie den Text in das uitext-Feld, dann wird dies es tun:

textField.text

Wenn Sie meinen, dass Sie den Text tatsächlich auswählen (wie in Hervorheben), kann dies nützlich sein:

Wählen Sie Alle


Eigentlich möchte ich den gesamten Text programmgesteuert auswählen (hervorheben), genauso wie wenn der Benutzer einmal auf Text und dann auf "Alles auswählen" tippt
Mirko

Die letzte Methode ist, was Sie dann wollen.
Kendall Helmstetter Gelner

1
Eigentlich nicht: Diese Methode wird aufgerufen, wenn der Benutzer im Bearbeitungsmenü auf den Befehl Alle auswählen tippt. Ich möchte Alle auswählen aufrufen, z. B. wenn der Benutzer auf den Befehl Alle auswählen tippt.
Mirko
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.