Wie kann ich programmgesteuert den gesamten Text in UITextField auswählen?
Antworten:
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.
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)
__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]; });
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;
[UIMenuController sharedMenuController].menuVisible = NO;
damit diese Zeile keine Wirkung hat.
setSelectedRange:
stattdessen verwenden.
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)
selectAll
Anruf tätigen viewDidAppear
. Es funktioniert nicht, wenn es in viewDidLoad
oder platziert wird viewWillAppear
.
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];
}
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
[textField selectAll:nil]
, wäre es gut, dies auch aufzulisten.
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.
Leider glaube ich nicht, dass du das kannst.
Ich bin nicht sicher, ob dies Ihnen hilft, aber setClearsOnBeginEditing
Sie können festlegen, dass der UITextField
vorhandene Wert gelöscht werden soll, wenn der Benutzer mit der Bearbeitung beginnt (dies ist die Standardeinstellung für sicher UITextFields
).
Swift 3:
textField.selectAll(self)
Ich erstelle eine benutzerdefinierte Warnansicht, die ein UITextField
Inneres enthält . Ich habe ein Problem mit dem Textfeld festgestellt: Es hat beginningOfDocument
nur Wert, wenn das Textfeld zum Bildschirm hinzugefügt becomeFirstResponder
wird und aufgerufen wird.
Andernfalls wird beginningOfDocument
zurückgegeben nil
und [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!!!
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!
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: