聚焦于UISearchBar,但键盘没有出现。

11

我已经阅读了许多有关如何聚焦搜索栏以使键盘在打开搜索视图时出现的解决方案,而所有这些解决方案都是像这样的:

[searchBar becomeFirstResponder];
mine is 
[self.searchDisplayController.searchBar becomeFirstResponder];
but I tried both.

我尝试了这个,我还加了一个

[self.searchDisplayController setActive:YES];

因为我正在使用SearchDisplayController,但到目前为止我能够得到的最佳结果是将光标放在搜索栏上,带有覆盖层的uitableview,但仍然没有键盘。

如果我运行模拟器,我可以用电脑的键盘在搜索栏上输入,但在iPhone上我什么也做不了。

如果您想查看我的代码:http://nopaste.info/39fcda4771.html,应该在viewDidLoad方法中执行聚焦。

再次感谢。


我遇到了同样的问题,我的搜索栏聚焦时,在模拟器上光标会闪烁,但键盘却没有显示。你找到解决办法了吗? - Amit Battan
4个回答

8

我正在textFieldDidBeginEditing:(UITextField *)textField委托方法中显示搜索栏。

键盘没有显示。因此,首先将textField作为第一个响应者取消。即:

[textField resignFirstResponder];

然后延迟调用方法。
[self performSelector:@selector(callSearchBar) withObject:NULL afterDelay:0.2];

在哪里

-(void)callSearchBar{
[self.searchDisplayController setActive: YES animated: YES]; 
self.searchDisplayController.searchBar.hidden = NO;
[self.searchDisplayController.searchBar becomeFirstResponder];

}

它有效


这最终对我起作用了!点个赞。你有什么想法,为什么你必须这样做 [self.searchDisplayController.searchBar becomeFirstResponder]; 而不是 [self.searchBar becomeFirstResponder]; - scottmrogowski
这个方法可以正常工作,但我建议在viewDidAppear:方法中简单地执行[self callSearchBar]。我们无法可靠地知道控制器转换可能需要多长时间,因此如果您的延迟时间太短以至于无法聚焦到searchBar,则可能会出现丑陋的效果和/或意外的tableview伪像。尽管如此,还是要点赞 :-) - jweyrich
@scottmrogowski,你必须使用self.searchDisplayController.searchBar,因为你可能已经将UISearchDisplayController连接到了你的UITableViewController,所以你没有在UITableViewController类中拥有一个searchBar变量,但是你可以通过UISearchDisplayController变量获取这个引用。 - ricky.tribbia

5
使用UISearchBarDelegate并在头文件中声明searchBar,例如...
@interface mySearchScreen : UIViewController <UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate> {

UITableView *myTableView;   
NSMutableArray *tableData;
UISearchBar *sBar;//search bar

并在loadView中声明您的搜索栏
- (void)loadView {  
[super loadView];   
sBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0,0,320,30)];   
sBar.delegate = self;   
[self.view addSubview:sBar];    
myTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 31, 300, 400)];   
myTableView.delegate = self;    
myTableView.dataSource = self;  
[self.view addSubview:myTableView];

tableData = [[NSMutableArray alloc]init];

然后在viewDidAppear中对您的搜索栏使用becomeFirstResponder。

- (void)viewDidAppear:(BOOL)animated {
//ensure the keyboard comes up from the start
[sBar becomeFirstResponder];    
[super viewDidAppear:animated];

}


2
不应该先调用 [sBar becomeFirstResponder];,再调用 [super viewDidAppear:animated]; - yunas
在我这里可以工作,我在[super viewDidAppear:animated]之后调用活动搜索栏。 - c9s

3
序列的顺序很重要。
[self.searchDisplayController setActive:YES animated:YES];
[self.searchDisplayController.searchBar becomeFirstResponder];

如果没有运气,那么请检查搜索显示控制器的委托是否已链接。还值得检查搜索栏的色调颜色。


3
模拟器上,确保您单击切换软件键盘以使用模拟器的键盘,如图所示。请参考下面的图片。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接