在 UISearchbar iOS 中 selectedTextRange 返回 nil

Posted

技术标签:

【中文标题】在 UISearchbar iOS 中 selectedTextRange 返回 nil【英文标题】:selectedTextRange return nil in UISearchbar iOS 【发布时间】:2015-05-20 03:51:03 【问题描述】:

我有一个UISearchBar,我得到了UITextfield,然后我想设置选定的文本范围,但它总是返回零。这是我的代码:

UITextField *searchField = [self.searchBar valueForKey:@"_searchField"];
[searchField becomeFirstResponder]; // focus to this searchfield

然后我填写文字:

self.searchBar.text = @"This is text";

并检查UITextField 文本是否已填写。尽管如此,所有关于UITextPositionUITextRange 的方法都返回nil:

UITextRange *selectedRange = [searchField selectedTextRange]; //selectedRange = nil
UITextPosition *newPosition = [searchField positionFromPosition:selectedRange.start offset:addressToComplete.street.length]; //newPosition = nil
UITextRange *newRange = [searchField textRangeFromPosition:newPosition toPosition:newPosition]; //newRange = nil

我的代码有问题吗?

【问题讨论】:

你确定searchField 不是nil 是的,我确定它不是 nil 阅读selectedTextRange 的文档。它说如果没有选择它会返回nil。调用这些方法时文本字段是否有焦点? 是的,我首先通过调用 [searchField becomeFirstResponder] 将焦点设置到此文本字段;我已经更新了我的问题。你知道我的代码有什么问题吗?不明白为什么会这样。 【参考方案1】:

您是否尝试过记录UITextField *searchField?从外观上看它为零..我认为您的代码应该是..

(UITextField *)[self.searchBar valueForKey:@"_searchField"]

([在尝试您的代码之后] OooOoKayyy.. 它可以工作.. 哈哈哈..)顺便说一句,这就是我在 searchBar 中获取 UITextField 的方式..

for (id object in [[[self.searchBar subviews] objectAtIndex:0] subviews])

    if ([object isKindOfClass:[UITextField class]])
    
        UITextField *searchField = (UITextField *)object;
        break;
    

首先我尝试了你所拥有的:

UITextField *searchField = (UITextField *)[searchBar valueForKey:@"_searchField"];
searchBar.text = @"This is text";
// and logging your searchField.text here.. returns nil/empty.. 

我试着像这样重新排列它......

 searchBar.text = @"This is text";
 UITextField *searchField = (UITextField *)[searchBar valueForKey:@"_searchField"];
 NSLog(@"searchFields.text :%@", searchField.text);

我再次在-(void)viewDidLoad 下尝试了您的代码,但不好,是的,正如您所说,它总是 nil.. 现在看起来像这样..

- (void)viewDidLayoutSubviews

    [super viewDidLayoutSubviews];
    searchBar.text = @"This is text"; // not important

    UITextField *searchField = [searchBar valueForKey:@"_searchField"];
    [searchField becomeFirstResponder];

     UITextRange *selectedRange = [searchField selectedTextRange]; //selectedRange = not nil anymore

     NSLog(@"searchField.text :%@ -> selectedRange :%@\n\n" , searchField.text, selectedRange);

//i've also tried it inside uibutton's event and i worked .. >.< 

我以编程方式选择了TextRange(出于示例目的),可能它与xibs自动布局或其他东西有关(奇怪的是我没有体验过)但它就在那里,试试吧.. :)

希望对你有所帮助..

编码愉快..干杯!

【讨论】:

谢谢,但它仍然无法正常工作。我记录了搜索字段,并确保它不是零。顺便说一句,我的搜索栏是 XIB 的出口,这可能是原因吗? @NTNT.. 我再次尝试了您的代码,是的,我也认为这是由 Xibs 自动布局引起的.. 嗯.. 我将您的代码放在里面:- (void)viewDidLayoutSubviews [super viewDidLayoutSubviews]; 我会编辑我的答案.. 谢谢。但是你如何尝试uibutton的事件?我把它写在1个事件中但是当调用那个事件时,它仍然显示为零。我还尝试将我的代码放在 viewDidLayoutSubviews 中,并且成功了!所以压力...

以上是关于在 UISearchbar iOS 中 selectedTextRange 返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

UISearchBar 在 iOS 7 中隐藏视图

如何在iOS 7中更改文本UISearchBar的取消按钮颜色?

在 iOS 8 中更改 UISearchBar 取消按钮文本

在 iOS 9+ 中更改 UISearchBar 文本颜色

如何在 iOS7 中更改 UISearchBar 的 inputView?

在 iOS 11 中限制 UISearchBar 的高度