UISearchBar选择所有文本

时间:2011-12-08 17:45:34

标签: objective-c ios uisearchbar selectall

有没有办法选择UISearchBar中的所有文字? 我尝试了[searchBar selectALL:],但它抛出了信号(无法识别的选择器)。

我想允许用户更改以前的搜索文本。在某个时候,当用户刚刚开始输入新请求时,旧的请求应该被解雇。如何实现它的标准方法 - 在文本开始编辑时选择所有文本。

7 个答案:

答案 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
}