在Objective-C中的搜索栏内按下时,UISearchController会触及安全区域

Posted

技术标签:

【中文标题】在Objective-C中的搜索栏内按下时,UISearchController会触及安全区域【英文标题】:UISearchController touches in safe area when press inside the search bar in Objective-C 【发布时间】:2019-10-31 17:13:30 【问题描述】:

我有一个tableview,我以编程方式创建了一个UISearchController 并添加到tableview。

最初它看起来不错,但是当我在搜索栏内按下时,它看起来如下。

我不想将搜索栏保留在导航栏中。而且我不能使用 UITableViewController。

找到下面我实现的代码。

我的 .h 文件

@property (strong, nonatomic) UISearchController *searchController;  
NSMutableArray *tableData;  
NSArray *filteredContentList;

我的 .m 文件

// New SearchController.
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.searchController.searchResultsUpdater = self;
    self.searchController.dimsBackgroundDuringPresentation = NO;
    self.searchController.searchBar.delegate = self;
    self.searchController.searchBar.searchBarStyle = UISearchBarStyleProminent;

    [self.searchController.searchBar sizeToFit];
    self.tblUserList.tableHeaderView = self.searchController.searchBar;
    self.definesPresentationContext = YES;  

#pragma mark - UISearchDisplayDelegate

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController 
    NSString *searchString = searchController.searchBar.text;
    NSPredicate *resultPredicate;

    //resultPredicate = [NSPredicate predicateWithFormat:@"displayname contains[c] %@",searchString];
    resultPredicate = [NSPredicate predicateWithFormat:@"value contains[c] %@", searchString];
    filteredContentList = [tableData filteredArrayUsingPredicate:resultPredicate];
    //filteredContentList = [[tableData valueForKey:@"data"] filteredArrayUsingPredicate:resultPredicate];
    [self.tblUserList reloadData];

- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope 
    [self updateSearchResultsForSearchController:self.searchController];

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index 
    CGRect searchBarFrame = self.searchController.searchBar.frame;
    [self.tblUserList scrollRectToVisible:searchBarFrame animated:NO];
    return NSNotFound;

我想在 tableview 上方而不是在导航栏中显示我的搜索栏。

提前致谢。

【问题讨论】:

你为什么使用 UISearchController ?当您在内部视图中使用它时,只需使用 SearchBar 即可避免上述问题。 【参考方案1】:

我自己迟到的答案。 我使用UITextFiled 而不是UISearchBar。下面是我的代码实现。

[self.searchTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; 

还有我的textFieldDidChange 方法

-(void)textFieldDidChange:(UITextField *)textField

    searchTextString=textField.text;
    [self updateSearchArray:searchTextString];


-(void)updateSearchArray:(NSString *)searchText 
    if(searchText.length==0) 
        isFilter=NO;
     else 
        isFilter=YES;
        filteredContentList = [[NSMutableArray alloc]init];
        NSPredicate *resultPredicate;
        resultPredicate = [NSPredicate predicateWithFormat:@"value contains[c] %@", searchText];
        filteredContentList = [tableData filteredArrayUsingPredicate:resultPredicate];
        [self.tblUserList reloadData];

    
  

还有我的 TableView 方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    NSInteger numOfSections = 0;
    if ([filteredContentList count] || [tableData count]) 
        _tblUserList.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
        numOfSections                = 1;
        _tblUserList.backgroundView = nil;
     else 
        UILabel *noDataLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, _tblUserList.bounds.size.width, _tblUserList.bounds.size.height)];
         noDataLabel.text = NSLocalizedString(@"No Users found", @"Message");
         noDataLabel.textColor = [UIColor blackColor];
         noDataLabel.textAlignment = NSTextAlignmentCenter;
         _tblUserList.backgroundView = noDataLabel;
         _tblUserList.separatorStyle = UITableViewCellSeparatorStyleNone;
    
    return numOfSections;

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    /*if (isSearching) 
        return [filteredContentList count];
    
    else 
        return [tableData count];
    */
    if (isFilter) 
        return [filteredContentList count];
     else 
        return [tableData count];
    


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString *simpleTableIdentifier = @"SimpleTableItem";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    
    //cell.textLabel.text = [[tableData objectAtIndex:indexPath.row] valueForKeyPath:@"data.displayname"];
    // Configure the cell...
    if (isFilter) 
        //cell.textLabel.text = [filteredContentList objectAtIndex:indexPath.row];
        cell.textLabel.text = [[filteredContentList objectAtIndex:indexPath.row] valueForKeyPath:@"data.displayname"];
    
    else 
        cell.textLabel.text = [[tableData objectAtIndex:indexPath.row] valueForKeyPath:@"data.displayname"];
    
    return cell;
  

【讨论】:

以上是关于在Objective-C中的搜索栏内按下时,UISearchController会触及安全区域的主要内容,如果未能解决你的问题,请参考以下文章

10.2 鼠标事件

UGUI事件系统——事件接口

SpriteKit中的按下按钮

Objective-C 链接两个 Tableview

如何在按钮按下时在集合视图中滚动(水平)?

VBA Access 2003 只允许在合理的时间内按下按钮一次