有没有办法选择UISearchBar中的所有文字? 我尝试了[searchBar selectALL:],但它抛出了信号(无法识别的选择器)。
我想允许用户更改以前的搜索文本。在某个时候,当用户刚刚开始输入新请求时,旧的请求应该被解雇。如何实现它的标准方法 - 在文本开始编辑时选择所有文本。
答案 0 :(得分:10)
这可以使用标准的UIResponder语义来完成。无需深入了解UISearchBar的私有视图层次结构。
[[UIApplication sharedApplication] sendAction:@selector(selectAll:) to:nil from:nil forEvent:nil]
您可以从任何地方调用此方法,selectAll:
选择器将运行响应程序链以查看是否有任何对象响应它。假设您的搜索栏当前是第一个响应者(如果用户正在键入它),它将响应并且结果将是所有文本被选中。如果不是,您可以通过在搜索栏上调用becomeFirstResponder
将其作为第一响应者。
[_mySearchBar becomeFirstResponder]
[[UIApplication sharedApplication] sendAction:@selector(selectAll:) to:nil from:nil forEvent:nil]
答案 1 :(得分:4)
如果您想要“替换类型”功能,选择UITextField中的文字会给您(即十字架上的额外点击是不可接受的),您可以挖掘{{3}的子视图找到UITextField(或UISearchBarTextField)并选择其文本:
// need to select the searchBar text ... UITextField * searchText = nil; for (UIView *subview in searchBar.subviews) { // we can't check if it is a UITextField because it is a UISearchBarTextField. // Instead we check if the view conforms to UITextInput protocol. This finds // the view we are after. if ([subview conformsToProtocol:@protocol(UITextInput)]) { searchText = (UITextField*)subview; break; } } if (searchText != nil) [searchText selectAll:self];
答案 2 :(得分:3)
在我的情况下,发送selectAll(_:)
在致电becomeFirstResponder
后没有立即发挥作用。
我通过等待一个runloop来解决它:
斯威夫特2:
dispatch_async(dispatch_get_main_queue()) {
UIApplication.sharedApplication().sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, forEvent: nil)
}
斯威夫特3:
DispatchQueue.main.async(execute: {
UIApplication.sharedApplication().sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, forEvent: nil)
})
答案 3 :(得分:2)
这是另一个建议:当某人激活搜索栏时,有两种可能的意图:键入新文本或添加到现有文本。我认为你应该给你的用户选择。
如果他想要添加文本,他会在现有文本的末尾自然地再次点击。
如果他想重新开始,他可以按下搜索栏激活时自动显示的清除按钮。
答案 4 :(得分:0)
我认为没有一种方法可以选择所有文字。也许当关注UISearchBar
时,您可以像这样清除搜索栏 - searchBar.text = @""
即。搜索栏中的明文...希望这会有所帮助...
答案 5 :(得分:0)
您可以通过保持BOOL
指示是否刚刚开始编辑搜索栏文本字段来完成此操作。然后,您可以在searchBar委托方法中捕获第一个按键。
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
firstEdit = YES;
}
- (BOOL)searchBar:(UISearchBar *)searchBar
shouldChangeTextInRange:(NSRange)range
replacementText:(NSString *)text {
if (firstEdit) {
searchBar.text = text;
firstEdit = NO;
}
return YES;
}
答案 6 :(得分:0)
快捷键4
如果要在searchBar
成为第一响应者时选择所有文本。
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
DispatchQueue.main.async {
UIApplication.shared.sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, for: nil)
}
return true
}