有没有办法在UISearchBar中选择所有文本?我尝试使用[searchBar selectALL:],但它会抛出信号(未识别的选择器)。
我想允许用户更改以前的搜索文本。同时,当用户开始输入新请求时,旧请求应该被取消。实现它的标准方法是在文本开始编辑时选择所有文本。
有没有办法在UISearchBar中选择所有文本?我尝试使用[searchBar selectALL:],但它会抛出信号(未识别的选择器)。
我想允许用户更改以前的搜索文本。同时,当用户开始输入新请求时,旧请求应该被取消。实现它的标准方法是在文本开始编辑时选择所有文本。
可以使用标准的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]
在我的情况下,在调用 becomeFirstResponder
后,发送 selectAll(_:)
不会立即生效。
我通过等待一个 runloop 来解决这个问题:
Swift 2:
dispatch_async(dispatch_get_main_queue()) {
UIApplication.sharedApplication().sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, forEvent: nil)
}
Swift 3:
DispatchQueue.main.async(execute: {
UIApplication.sharedApplication().sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, forEvent: nil)
})
// 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];
Swift 4
如果你想要在searchBar
成为第一响应者时选择所有文本。
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
DispatchQueue.main.async {
UIApplication.shared.sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, for: nil)
}
return true
}
我认为没有一种方法可以选择所有文本。也许当焦点在UISearchBar
上时,您可以像这样清除搜索栏 - searchBar.text = @""
即清除搜索栏中的文本...希望这能在某种程度上帮助到您...
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;
}