导航栏的iOS7 UISearchDisplayController错误不会自动隐藏

时间:2015-05-26 13:29:06

标签: objective-c ios7 uisearchbar uisearchdisplaycontroller

Reveal显示以下内容:

-> UINavigationBar
-> UINavigationTransitionView
   ->UITableView
     ->UISearchDisplayController
       ->UISearchBar

当我点击searchBar时,searchDisplayController不会隐藏NavigationBar,而是显示其中的一半。

我不使用自动布局(所以不是约束),我使用的是UITableViewController,我不能使用新的UISearchController,我正在寻找一个解决方案,要么让它工作正常,要么不允许它扩展。问题仅发生在iPad上。该项目支持iOS7及以上版本。

我试图通过以下方法捕捉所有内容:

#pragma mark - UISearchDisplayController Delegate

- (void)searchDisplayController:(UISearchDisplayController *)controller willHideSearchResultsTableView:(UITableView *)tableView {
    self.onlineSearchRequestUUID = [NSUUID UUID];
    dispatch_async(self.searchSerialQueue, ^{
        if ([self.parentVC needsEmail]) {
            self.capiContact->setFilter(CAPIContactFilter::WithEmail, "");
        } else {
            self.capiContact->setFilter(CAPIContactFilter::All, "");
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.parentVC.tableView reloadData];
        });
    });
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    dispatch_async(self.searchSerialQueue, ^{
        [self filterContentForSearchText:searchString
                                   scope:[controller.searchBar scopeButtonTitles][[controller.searchBar selectedScopeButtonIndex]]];
        dispatch_async(dispatch_get_main_queue(), ^{
            [controller.searchResultsTableView reloadData];
            if ([searchString length] == 0) {
                [self.parentVC.tableView reloadData];
            }
        });
    });
    return NO;
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
    dispatch_async(self.searchSerialQueue, ^{
        [self filterContentForSearchText:[controller.searchBar text]
                                   scope:[controller.searchBar scopeButtonTitles][searchOption]];
        dispatch_async(dispatch_get_main_queue(), ^{
            [controller.searchResultsTableView reloadData];
        });
    });
    return NO;
}

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
    if (![self.tableView isEditing]) {
        searchBar.showsScopeBar = YES;
        [searchBar sizeToFit];


        _oldnavCol = [self.navigationController.view.backgroundColor copy];
        @try {
            [self.navigationController.view setBackgroundColor:[[[[self.parentVC.searchDisplayController searchBar] subviews][0] subviews][1] barTintColor]];
        }
        @catch (NSException *exception) {
            LogDebug(@"%@", exception);
        }

        return YES;
    }
    return NO;
}

- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {
    double delayInSeconds = .5;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
        {
            [self.navigationController.view setBackgroundColor:_oldnavCol];
            _oldnavCol = nil;
        }
    });
    return YES;
}

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
//Here is where i have tried most of my tries to make it work with hacks but with no luck. 
    //self.navigationController.navigationBar.translucent = YES;
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        self.searchDisplayController.searchBar.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 88);
    }
}

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
    self.tableSearchText = searchText;
//some code here

    if ([searchText length]) {
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
            NSString *uuid = [self.onlineSearchRequestUUID UUIDString];
            //some  more code here
        });
    }
}

我不认为我错过了什么。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        [[[parentViewController navigationController] navigationBar] setHidden: YES];
    }
}

对于我的情况,parentViewController是self或self.parentVC,它就像一个魅力。