2015-05-26 1 views
2

Reveal показывает следующее:iOS7 UISearchDisplayController ошибка с навигационной панелью автоматически не скрыта

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

Когда я попал в SearchBar searchDisplayController не скрывает Панель навигации вместо этого он показывает половину.

Я не использую автоматическую компоновку (так что это не ограничения), я использую 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
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller { 

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

для моего случая parentViewController - это либо self, либо self.parentVC, и он работает как шарм.