在beginEditing上选择UISearchBar中的所有文本?

时间:2014-01-22 11:18:03

标签: ios objective-c cocoa-touch uitextfield 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]]];
    }
}

3 个答案:

答案 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];