UISearchBar 选择所有文本

Posted

技术标签:

【中文标题】UISearchBar 选择所有文本【英文标题】:UISearchBar select all text 【发布时间】:2011-12-08 17:45:33 【问题描述】:

有什么方法可以选择 UISearchBar 中的所有文本? 我尝试了 [searchBar selectALL:],但它抛出了信号(无法识别的选择器)。

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

【问题讨论】:

【参考方案1】:

这可以使用标准的 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]

【讨论】:

【参考方案2】:

如果您想要在UITextField 中选择文本为您提供的“替换类型”功能(即不能接受在十字架上的额外点击),您可以挖掘UISearchBar 的子视图以找到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];

【讨论】:

请注意,这在 ios 7 中不再有效 - 文本字段现在嵌套在视图层次结构的更深处。要解决此问题,只需将代码更改为遍历层次结构直到找到文本字段的递归版本。 “selectAll:”方法也可能存在问题,具体取决于您实际想要实现的目标。 See this question for more details。另请注意,我必须在 viewDidAppear 中调用它,而不是在 viewWillAppear 中调用它才能工作。【参考方案3】:

在我的情况下,发送selectAll(_:) 在调用becomeFirstResponder 后并没有立即工作。

我通过等待一个运行循环来解决它:

斯威夫特 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)
)

【讨论】:

【参考方案4】:

这里有另一个建议:当有人激活搜索栏时,有两种可能的意图:输入新文本或添加到现有文本。我认为你应该给你的用户选择。

如果他想添加文本,他自然会再次点击现有文本的末尾。

如果他想重新开始,他可以按下搜索栏激活时自动出现的清除按钮。

【讨论】:

嗯,这是最好的解决方案。 此行为与 iOS 上的 Safari 不同,后者在您点击地址栏时选择文本。【参考方案5】:

斯威夫特 4

如果您想在searchBar 成为第一响应者时选择所有文本。

func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool 
    DispatchQueue.main.async 
        UIApplication.shared.sendAction(#selector(UITextField.selectAll(_:)), to: nil, from: nil, for: nil)
    
    return true

【讨论】:

【参考方案6】:

我认为没有一种方法可以选择所有文本。也许当关注 UISearchBar 时,您可以像这样清除搜索栏 - searchBar.text = @""

即搜索栏中的明文...希望这在某种程度上有所帮助...

【讨论】:

在这种情况下,用户无法更改请求。如果它是一个长字符串,重新键入它可能会很烦人。【参考方案7】:

您可以通过保留 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;

【讨论】:

有什么方法可以突出显示文字吗?

以上是关于UISearchBar 选择所有文本的主要内容,如果未能解决你的问题,请参考以下文章

自定义键盘文本完全替换 UISearchBar 中的文本,而不是添加到其中 [iOS]

使用 Monotouch 在 UISearchBar 上更改“取消”按钮的文本?

使用APICloud AVM多端组件快速实现app中的搜索功能

iOS MKLocalSearch导致崩溃[重复]

UISearchBar 自定义

字段为空时为 UISearchBar 启用“搜索”按钮? (IOS 7)