我正在尝试模拟iOS Safari中的地址栏的行为 - 也就是说,如果敲击地址栏中的文本,则选择它。大多数桌面浏览器也可以正常工作。我不想在选择时清除它,而只是选择内部的内容,因此,如果用户开始键入,它将清除,但是用户也可以在现有字符串中编辑现有字符串。
我已经尝试了以下操作,它在ios7和ios6下的子视图中找到了UISearchBarTextField
,但是在其上调用selectAll
似乎没有任何效果。我已经尝试更改其text
属性,效果很好,只是selectAll
不高兴。
我还尝试将参数更改为 selectAll:
到 self
和其他几件事,没有更改,只是不想在其中选择文本!
有什么想法吗?这是我的代码:
- (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
...
遇到了相同的问题。帮助我的事情是将selectAll
推迟了一段时间。
我为UISearchBar
extension UISearchBar {
func selectAllText() {
guard let searchTF = self.valueForKey("searchField") as? UITextField else {
return
}
if searchTF.respondsToSelector(#selector(NSObject.selectAll(_:))) {
searchTF.selectAll(nil)
}
}
}
然后,我只需短暂延迟在我的搜索栏上调用此方法。
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()
}
警告:这种方法远非明确的解决方案,但效果很好。短延迟不会引起任何麻烦,因为它只是文本场上的选择动作。尽管访问UISearchBar
的searchField
属性可能会导致应用拒绝!
对我来说,传递uitextfield参数无效。我正在传递到selectall方法nil param,因此您的行应该看起来像:
[textField selectAll:nil];