我正在尝试模拟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]]];
}
}
答案 0 :(得分:1)
您可以使用:[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
...
答案 1 :(得分:1)
遇到同样的问题。帮助我的是在短时间内推迟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()
}
警告:强>
这种方法远非明确的解决方案,但它工作正常。短暂的延迟不应该造成任何麻烦,因为它只是在文本字段上的选择操作。虽然访问searchField
的{{1}}属性会导致拒绝应用!
答案 2 :(得分:0)
对我来说,传递UITextField参数并不起作用。我传递给selectAll方法nil param,所以你的行应该是这样的:
[textField selectAll:nil];