在开始时选择UISearchbar中的所有文本



我正在尝试模拟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()
}

警告:这种方法远非明确的解决方案,但效果很好。短延迟不会引起任何麻烦,因为它只是文本场上的选择动作。尽管访问UISearchBarsearchField属性可能会导致应用拒绝!

对我来说,传递uitextfield参数无效。我正在传递到selectall方法nil param,因此您的行应该看起来像:

    [textField selectAll:nil];

最新更新