如何以编程方式选择UITextField中的所有文本?
Answers:
原来,调用-selectAll:使用非零发送者显示菜单。用nil调用它会使它选择文本,但不显示菜单。
在我的bug报告从Apple回来后,我建议我通过nil而不是self来尝试。
无需考虑UIMenuController或其他选择API。
那就是我的诀窍:
[self.titleField setSelectedTextRange:[self.titleField textRangeFromPosition:self.titleField.beginningOfDocument toPosition:self.titleField.endOfDocument]];
很难看,但是它可以工作,所以不会显示sharedMenuController!
要解决“仅第二次才有效”的问题,请使用以下命令:
__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(刚刚从这里的评论中编辑)
__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]; });
我刚刚进行了测试,以验证Mirko的上述评论,但是我的测试验证了selectAll:
发送给UITextField本身时确实选择了所有文本。
请注意,文本将立即被CUT |隐藏。复制| 粘贴动作,但是您的问题恰恰是用户点击“全选”时出现的内容。
我要使用的解决方案如下,请注意,第二行将暂时隐藏“ CUT / COPY / PASTE”对话框,而不会为明确的用户选择禁用它
[_myTextField selectAll:self];
[UIMenuController sharedMenuController].menuVisible = NO;
[UIMenuController sharedMenuController].menuVisible = NO;
因此该行不会产生任何影响。
setSelectedRange:
。
使用您所需要的
对象
[yourtextField becomeFirstResponder]; //puts cursor on text field
[yourtextField selectAll:nil]; //highlights text
[yourtextField selectAll:self]; //highlights text and shows menu(cut copy paste)
迅速
yourTextField.becomeFirstResponder() //puts cursor on text field
yourTextField.selectAll(nil) //highlights text
yourTextField.selectAll(self) //highlights text and shows menu(cut copy paste)
selectAll
呼叫置于viewDidAppear
。将其放在viewDidLoad
或中时将不起作用viewWillAppear
。
这是我找到的最佳解决方案。没有sharedMenuController,它可以连续工作:
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
[textField performSelector:@selector(selectAll:) withObject:nil afterDelay:0.1];
}
迅速
选择所有文本UITextField
:
textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)
我的完整答案在这里:https : //stackoverflow.com/a/34922332/3681880
[textField selectAll:nil]
,也可以列出它。
为了能够选择文本,文本字段必须是可编辑的。要知道何时可以编辑文本字段,请使用委托方法:
- (void)textFieldDidBeginEditing:(UITextField *)textField
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
我不认为textFieldShouldBeginEditing:是必需的,但这是我在实现中使用的。
- (void)textFieldDidBeginEditing:(UITextField *)textField{
[textField selectAll:textField];
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
return YES;
}
将nil传递给selectAll:不会显示菜单。
我创建一个包含UITextField
内部的自定义警报视图。我发现该文本字段存在一个问题:beginningOfDocument
仅当将文本字段添加到屏幕becomeFirstResponder
并被调用时才有价值。
否则beginningOfDocument
返回nil
和[UITextField textRangeFromPosition:]
无法获取该值。
所以这是我的示例代码来解决这种情况。
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)];
做完了!
如果您是说要如何允许用户编辑uitextfield中的文本,则只需为其分配firstResponder即可:
[textField becomeFirstResponder]
如果您的意思是如何在uitextfield中获取文本,那么它将执行以下操作:
textField.text
如果您的意思是实际选择文本(如突出显示),那么这可能会很有用: