GVKun编程网logo

当UISearchController处于活动状态时,iOS 9 searchBar从表标题视图中消失

34

对于当UISearchController处于活动状态时,iOS9searchBar从表标题视图中消失感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于IOSsearchBar和search

对于当UISearchController处于活动状态时,iOS 9 searchBar从表标题视图中消失感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于IOS searchBar和searchDisplayController 使用、IOS UISearchBar UISearchController使用、ios UISearchController、iOS UISearchController的使用方法的宝贵知识。

本文目录一览:

当UISearchController处于活动状态时,iOS 9 searchBar从表标题视图中消失

当UISearchController处于活动状态时,iOS 9 searchBar从表标题视图中消失

结构:

View1(单击按钮)->模态显示(MyModalView:UITableViewController)

MyModalView嵌入了UISearchController。
UISearchController 的searchBar 放在MyModalView.tableView.tableHeaderView中。

自iOS 8.0起,它一直运行良好。但是在iOS 9上,
当UISearchController处于活动状态时,searchBar 消失。请在
下面看这些照片

模态视图:模态视图

在iOS 8上有效的UISearchController:iOS 8中的搜索栏

在iOS 9上有效的UISearchController:iOS 9中的搜索栏

非常标准的代码:

override func viewDidLoad() {    super.viewDidLoad()    // Dynamically create a search controller using anonymous function    self.resultSearchController = ({        let controller = UISearchController(searchResultsController: nil)        controller.searchResultsUpdater = self        controller.dimsBackgroundDuringPresentation = false        controller.searchBar.sizeToFit()        controller.searchBar.delegate = self        self.tableView.tableHeaderView = controller.searchBar        return controller    })()    // Auto sizing row & cell height    self.tableView.estimatedRowHeight = 130    self.tableView.rowHeight = UITableViewAutomaticDimension    self.definesPresentationContext = true    // No footer for better presentation    self.tableView.tableFooterView = UIView.init(frame: CGRectZero)}

此问题在iOS 9.1 Beta中也会发生。

任何想法/指针将不胜感激

答案1

小编典典

似乎我们每个人都遇到了相同的问题,但是解决
方法不同。但是,没有建议的答案对我有用:(。尽管如此,
感谢您的宝贵时间。

我有解决问题的解决方案。它正在 使用Interface Builder

情节提要中将我的(MyModalView:UITableViewController)的Extend Edges-Under Opaque Bars 设置为true 。

综上所述:

MyModalView:UITableViewController,在使用Interface Builder的情节提要中具有

IOS searchBar和searchDisplayController 使用

IOS searchBar和searchDisplayController 使用

1、加的是searchDisplayController 可以在storyboard中看到 seachDisplay

2、两个代理  UISearchBarDelegate,UISearchDisplayDelegate 并设置

3、连线 searchDisplay和searchBar

4、将 self.tableView.tableHeaderView=self.searchBar 固定住

5、搜索时调用的方法

#pragma mark 搜索方法

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{


    NSPredicate * query=[NSPredicate predicateWithFormat:@"SELF.name contains[c]%@",searchString];

    

    self.searchResult=[self.contacts filteredArrayUsingPredicate:query];

    

    return YES;

}




6、搜索的时候会显示自己的tableView  确定是不是searchDisplay.searchResultsTableView

7、修改tableView  count

8、跳转判断 查看联系人 

#prama mark 点击搜索后搜索
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    NSString * searchString=self.searchBar.text;
    
    NSPredicate * query=[NSPredicate predicateWithFormat:@"SELF.title contains[c]%@",searchString];
    
    self.searchResult=[self.searchData filteredArrayUsingPredicate:query];
    NSLog(@"self.searchResult%@",self.searchResult);
    [self.searchDisplay.searchResultsTableView reloadData];
}

/*

#pragma mark 实时搜索
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
    
    
    NSPredicate * query=[NSPredicate predicateWithFormat:@"SELF.title contains[c]%@",searchString];
    
    self.searchResult=[self.searchData filteredArrayUsingPredicate:query];
    return YES;
}
*/


参考资料

http://www.cnblogs.com/lesliefang/p/3929677.html

IOS UISearchBar UISearchController使用

IOS UISearchBar UISearchController使用

http://www.cnblogs.com/xiaofeixiang/p/4273620.html

ios UISearchController

ios UISearchController

1.searchResultsUpdater:设置显示搜索结果的控制器

    _mySearchController.searchResultsUpdater = self;

2.dimsBackgroundDuringPresentation:设置开始搜索时背景显示与否

    _mySearchController.dimsBackgroundDuringPresentation = NO;

3.[searchBar sizeToFit]: 设置 searchBar 位置自适应

    [_mySearchController.searchBar sizeToFit];

4. 设置 searchBar 为 UITableView 的头部视图

    self.myTableView.tableHeaderView = self.mySearchController.searchBar;

5.UISearchResultsUpdating: 代理方法


话不多说,直接上代码

@interface ViewController ()
            
@property (nonatomicstrongUITableView *myTableView;
@property (nonatomicstrongNSMutableArray *visableArray;
@property (nonatomicstrongNSMutableArray *filterArray;
@property (nonatomicstrongNSMutableArray *dataSourceArray;
@property (nonatomicstrongUISearchController *mySearchController;

@end

@implementation ViewController
            
- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self initial];
}

- (void)initial{
    self.dataSourceArray = [NSMutableArray array];
    self.filterArray = [NSMutableArray array];
    for (int i = 0; i < 26; i++) {
        for (int j = 0; j < 4; j++) {
            NSString *str = [NSString stringWithFormat:@"%c%d"''A''+i, j];
            [self.dataSourceArray addObject:str];
        }
    }
    
    self.visableArray = self.dataSourceArray;
    
    self.myTableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
    _myTableView.delegate = self;
    _myTableView.dataSource = self;
    [self.view addSubview:_myTableView];
    
    self.mySearchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    _mySearchController.searchResultsUpdater = self;
    _mySearchController.dimsBackgroundDuringPresentation = NO;
    [_mySearchController.searchBar sizeToFit];
    
    self.myTableView.tableHeaderView = self.mySearchController.searchBar;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if (!_visableArray || _visableArray.count == 0) {
        _visableArray = _dataSourceArray;
    }
    return _visableArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"identifier"];
    
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"identifier"];
    }
    
    cell.textLabel.text = [_visableArray objectAtIndex:indexPath.row];
    
    return cell;
}

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController{
    NSString *filterString = searchController.searchBar.text;
    
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains [c] %@", filterString];
    
    self.visableArray = [NSMutableArray arrayWithArray:[self.dataSourceArray filteredArrayUsingPredicate:predicate]];
    
    [self.myTableView reloadData];
}


iOS UISearchController的使用方法

iOS UISearchController的使用方法

UISearchController 让用户在 UISearchBar 上输入搜索关键词,展示搜索结果或者进行其他操作。UISearchController 把两个控制器(UIViewController)连在一起。父控制器放置 UISearchBar 控件。当用户点击搜索框时,UISearchBar 会移到屏幕顶部;输入搜索关键词,UISearchBar 下面出现子控制器的view。当然,也可以用代码使 UISearchBar 和子控制器展示出来,即便父控制器没有放置 UISearchBar。

一般用法

  1. 在父控制器中创建子控制器
  2. 用子控制器创建 UISearchController,通常会把 UISearchController 变成父控制器的属性
  3. 设置 UISearchController 的searchResultsUpdater属性
  4. 通常会在父控制器上放置 UISearchController 的searchBar
  5. 把父控制器definesPresentationContext属性设置为 true

以下为父控制器代码示例

let searchResultsVC = SearchResultsVC(allStrings: allStrings)
searchController = UISearchController(searchResultsController: searchResultsVC)
searchController.searchResultsUpdater = searchResultsVC;
let tableView = UITableView(frame: view.bounds)
tableView.dataSource = self
view.addSubview(tableView)
tableView.tableHeaderView = searchController.searchBar;
tableView.tableFooterView = UIView()
definesPresentationContext = true;

UISearchController 的searchResultsUpdater属性一般设置为父控制器或子控制器。这个属性的值要符合 UISearchResultsUpdating 协议,实现updateSearchResults(for searchController: UISearchController)方法。这个方法会在searchBar变为第一响应者(比如,当用户点击搜索框,键盘弹出),以及搜索关键词改变时调用。在这个方法中写入执行搜索、更新 UI 的代码。

以上代码将子控制器作为 UISearchController 的searchResultsUpdater。假设子控制器的数据源为 allStrings 和 strings,均为含 String 的 Array。其中,allStrings 为常量,包含所有的 String;strings 包含符合搜索条件的 String,需要在用户输入时更新。搜索条件为,含有用户输入的内容,不区分大小写。用 UITableView 展示搜索结果。在updateSearchResults(for searchController: UISearchController)方法中,获取 searchBar 的text,更新 strings,更新 UI。

以下是子控制器代码示例

func updateSearchResults(for searchController: UISearchController) {
 strings.removeAll()
 if let text = searchController.searchBar.text?.uppercased(), !text.isEmpty {
  strings = allStrings.filter { $0.contains(text) }
 }
 tableView.reloadData()
}

改变样式

默认情况下,用户点击搜索框,导航栏(navigation bar)隐藏,UISearchBar 上移,下面能看到父控制器,但有灰色蒙版遮挡。点击灰色蒙版,退回父控制器。把 UISearchController 的hidesNavigationBarDuringPresentation属性设置为false,则导航栏不隐藏。把 UISearchController 的dimsBackgroundDuringPresentation属性设置为false,则灰色蒙版不显示,能点击父控制器。

搜索框为空时,子控制器隐藏

如果 UISearchController 的searchBar已经放置在父控制器上,用户点击搜索框时,UISearchBar 会上移至屏幕顶部,键盘弹出。此时会调用updateSearchResults(for searchController: UISearchController)方法,但子控制的view没有出现,isHidden为 true。输入内容后,子控制器的view才出现。清空输入的内容,子控制器的view消失。如果要在搜索框为空时也显示子控制器,在updateSearchResults(for searchController: UISearchController)方法中加入searchController.searchResultsController?.view.isHidden = false即可。

代码展示 UISearchBar 和子控制器的方法

在父控制中可以用代码来展示 UISearchBar 和子控制器,具体实现方法要看 UISearchController 的searchBar是否放置在父控制器上。

如果 UISearchController 的searchBar放置在父控制器上

UISearchBar 上移,弹出键盘(和用户点击搜索框一样的效果)

searchController.searchBar.becomeFirstResponder()

UISearchBar 上移,但不弹出键盘

present(searchController, animated: true, completion: nil)

或者

searchController.isActive = true

如果 UISearchController 的searchBar不在父控制器上

UISearchBar 从顶部出现,弹出键盘

present(searchController, animated: true, completion: nil)

搜索框一出来就成为第一响应者,键盘会弹出,不知道怎么禁止键盘弹出。当然,展示搜索框却不弹出键盘,是奇怪的需求。

代码已上传GitHub:https://github.com/Silence-GitHub/SearchControllerDemo

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!

您可能感兴趣的文章:
  • iOS开发之UITableView与UISearchController实现搜索及上拉加载,下拉刷新实例代码

今天关于当UISearchController处于活动状态时,iOS 9 searchBar从表标题视图中消失的讲解已经结束,谢谢您的阅读,如果想了解更多关于IOS searchBar和searchDisplayController 使用、IOS UISearchBar UISearchController使用、ios UISearchController、iOS UISearchController的使用方法的相关知识,请在本站搜索。

本文标签: