【问题标题】:Select all text in UISearchBar on beginEditing?在开始编辑时选择 UISearchBar 中的所有文本?
【发布时间】:2014-02-12 10:09:07
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c cocoa-touch uitextfield uisearchbar


    【解决方案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...

    【讨论】:

    • 不,恐怕也没有效果。不选择任何东西。看起来它正在做某事:如果我在通话前后打印出textField.selectedTextRange,我会得到:Before: <_UITextKitTextRange: 0x161da8d0> (8, 0)FAfter: <_UITextKitTextRange: 0xd648840> (0, 8)F 一个八字符的字符串。
    • 是的。很奇怪,它显然有一些效果,只是实际上并没有在 UI 中进行选择。例如,如果我输入,它会附加到末尾,而不是替换选择。
    【解决方案2】:

    遇到了同样的问题。帮助我的事情是将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)
            }
        }
    }
    

    然后我只需在搜索栏上调用此方法,并稍作延迟。

    斯威夫特 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 测试版 4

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

    警告: 这种方法远非明确的解决方案,但效果很好。短暂的延迟不会造成任何麻烦,因为它只是对文本字段的选择操作。虽然访问 UISearchBarsearchField 属性可能会导致应用被拒绝!

    【讨论】:

      【解决方案3】:

      对我来说,传递 UITextField 参数不起作用。我将传递给 selectAll 方法 nil 参数,因此您的行应如下所示:

          [textField selectAll:nil];
      

      【讨论】:

      • 不,恐怕使用nil 没有区别。 [textField selectAll:nil] 行被调用,但文本未在字段中选择。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多