在beginEditing中selectUISearchBar中的所有文本?

我试图在iOS Safari中模拟地址栏的行为 – 也就是说,如果地址栏中有文本,当它被点击时,它将被选中。 大部分桌面浏览器的工作方式也是如此。 我不想在select时清除它,只是select里面的内容,这样,如果用户开始input,就会清除,但用户也可以编辑现有的string。

我已经尝试了以下,它发现iOS7和iOS6下的子视图中的UISearchBarTextField ,但调用selectAll似乎没有任何效果。 我试图改变它的text属性,工作正常,只是selectAll不是很高兴。

我也尝试改变参数selectAll: self和其他一些事情,没有改变,只是不想select那里的文本!

有什么想法吗? 这是我的代码:

 - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { NSArray *subviews = [UIDevice isRunningiOS7OrAbove] ? [[searchBar.subviews objectAtIndex:0] subviews] : searchBar.subviews; for (UIView *subview in subviews) { if ([subview conformsToProtocol:@protocol(UITextInputTraits)]) { UITextField *textField = (UITextField *)subview; [textField selectAll:textField]; } } } 

编辑

我也尝试过,没有喜悦:

 for (UIView *subview in subviews) { if ([subview conformsToProtocol:@protocol(UITextInputTraits)]) { UITextField *textField = (UITextField *)subview; [textField setSelectedTextRange:[textField textRangeFromPosition:[textField beginningOfDocument] toPosition:[textField endOfDocument]]]; } } 

你可以使用: [UITextField setSelectedTextRange:(UITextRange *)]

 - (void)textFieldDidBeginEditing:(UITextField*)textField { UITextPosition *start = [textField beginningOfDocument]; UITextPosition *end = [textField endOfDocument]; UITextRange *range = [textField textRangeFromPosition:start toPosition:end]; [textField setSelectedTextRange:range]; } 

现在你可以实现使用UISearchBar

跑到同样的问题。 帮助我的是在短时间内推迟了select。

我为UISearchBar做了这个扩展

 extension UISearchBar { func selectAllText() { guard let searchTF = self.valueForKey("searchField") as? UITextField else { return } if searchTF.respondsToSelector(#selector(NSObject.selectAll(_:))) { searchTF.selectAll(nil) } } } 

那么我简单地在search栏上调用这个方法。

Swift 2

 let dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.05 * Double(NSEC_PER_SEC))) dispatch_after(dispatchTime, dispatch_get_main_queue(), { [weak self] in self?.nameSearchBar.selectAllText() }) 

Swift 3 Xcode 8 beta 4

 DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { [weak self] in self?.nameSearchBar.selectAllText() } 

警告:这种方法远不是明确的解决scheme,但它工作正常。 短暂的延迟不应该引起任何麻烦,因为它只是一个文本域的select操作。 虽然访问您的UISearchBarsearchField属性可能会导致应用程序拒绝!

对于我传递UITextField参数没有工作。 我通过selectAll方法无参数,所以你的行应该是这样的:

  [textField selectAll:nil];