chr*_*s P 30 keyboard objective-c uisearchbar ios uisearchcontroller
我花了很多时间在网上搜索并与其他开发者讨论这个问题无济于事.确切的问题在这篇SO帖子中有所描述(专注于UISearchBar,但键盘没有出现),虽然已经有很多年了.
我最近在IB中使用了已弃用的UISearchDisplayController和UISearchBar,并通过iOS8的代码切换到UISearchController.
然而,我遇到的问题是焦点被正确分配(你可以看出因为取消按钮在视图加载后动画到搜索栏的右侧),但是键盘没有显示出来.
这是我的代码.
.H
@property (nonatomic, strong) UISearchController *searchController;
Run Code Online (Sandbox Code Playgroud)
.M
- (void)viewDidLoad {
[super viewDidLoad];
...
[self initializeSearchController];
....
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self.searchController setActive:YES];
[self.searchController.searchBar becomeFirstResponder];
}
- (void)initializeSearchController {
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.searchController.delegate = self;
self.searchController.searchBar.delegate = self;
[self.searchController.searchBar sizeToFit];
[self.tableView setTableHeaderView:self.searchController.searchBar];
self.definesPresentationContext = YES;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过的东西.
我已经尝试在0.2秒延迟时调用becomeFirstResponder,正如另一篇SO帖子中所建议的那样.
我在viewDidAppear中设置了一个断点,并验证self.searchController和self.searchController.searchBar都是有效对象,都不是.
我已经尝试遵循UISearchControllerDelegate并使用以下代码片段
这里:
- (void)didPresentSearchController:(UISearchController *)searchController {
//no matter what code I put in here to becomeFirstResponder, it doesn't
//matter because this is never called, despite setting the
//self.searchController.delegate = self AND
//self.searchController.searchBar.delegate = self.
}
Run Code Online (Sandbox Code Playgroud)
我在故事板中从零开始创建了一个新的视图,并且相反于那个视图,以确保我的视图中没有旧的searchBar残余.这也不起作用.
我只是在真实设备(iPhone 6)上进行了测试,并不是没有显示键盘的模拟器问题.
我没有想法,我已经看到了与网络相关的每个问题和答案.什么都行不通.
为了再次澄清发生了什么,searchBar正确地成为第一个响应者,它右侧的取消按钮在屏幕上显示动画,证明这一点,但键盘没有出现,光标不会在searchBar中闪烁.
Seg*_*gev 20
你的代码看起来不错.你所描述的不是正常行为.您可以做的第一件事就是创建一个仅具有UISearchController功能的新项目,并了解它的运作方式.您可以使用它编辑您的问题,以便我们有更好的视图.
关于如何在UISearchController这里实现的一个很好的例子:Sample-UISearchController
添加:
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.searchController.searchBar becomeFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)
以MasterViewController_TableResults.m得到所需要的结果和键盘弹出的推出在iPad和iPhone与iOS 8.3.
您可以查看该项目,看看您的做法有何不同,
编辑:
显然,如果在键盘不显示[self.searchController setActive:YES]之前调用becomeFirstResponder.我想知道这是不是一个错误.
emn*_*mun 19
有同样烦人的问题.你会认为通过将SearchController设置为活动状态,它们都会显示搜索控制器和键盘.不幸的是,它只是第一部分.
我的解决方案
在viewDidAppear中使搜索控制器处于活动状态:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
resultSearchController.active = true
}
Run Code Online (Sandbox Code Playgroud)一旦它处于活动状态,在didPresentSearchController中作为第一响应者
func didPresentSearchController(searchController: UISearchController) {
searchController.searchBar.becomeFirstResponder()
}
Run Code Online (Sandbox Code Playgroud)小智 12
Swift 3.0(iOS 10)工作解决方案:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
searchController.isActive = true
DispatchQueue.main.async { [unowned self] in
self.searchController.searchBar.becomeFirstResponder()
}
}
Run Code Online (Sandbox Code Playgroud)
在iOS 9上,我发现它足以延迟becomeFirstResponder()到下一个运行循环:
func focusSearchField() {
searchController?.active = true
// skipping to the next run loop is required, otherwise the keyboard does not appear
dispatch_async(dispatch_get_main_queue(), { [weak self] in
self?.searchController?.searchBar.becomeFirstResponder()
})
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12562 次 |
| 最近记录: |