2015-05-04 2 views
2

Aloha.UISearchController & UISearchBar Подкласс

У меня возникли проблемы с получением пользовательского подкласса UISearchController, VLSearchController, с пользовательской панелью UISearch для вызова любого из его методов делегирования в моем UIViewController. У моих пользовательских подклассов нет каких-либо собственных методов делегирования, но я думал, что поскольку они являются подклассами ... их методы делегирования также будут подклассифицированы и должны быть определены внутри UIViewController, который инициализирует UISearchController.

После инициализации UISearchController, я поставил его делегат и делегат в SearchBar в к UIViewController:

_searchController = [[VLSearchController alloc] initWithSearchResultsController:nil]; 
self.searchController.searchBar.delegate = self; 
self.searchController.delegate = self; 

следующие методы делегата в моем UIViewController не дозвонились:

#pragma mark - UISearchBarDelegate 
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar; 

#pragma mark - UISearchController 
- (void)willPresentSearchController:(UISearchController *)searchController; 

#pragma mark - UISearchResultsUpdating 
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController; 

Пусть мне также упоминаем, что причиной того, что я подклассифицировал UISearchController, а также UISearchBar, было избавление от кнопки отмены. Нужно ли мне добавлять методы делегата в подклассы? Если да, то кто-нибудь мог бы объяснить, что будут делать эти методы делегата?

EDIT: Добавление Кодекса

UIViewController:

-(void) viewDidLoad 
{ 

    [super viewDidLoad]; 

    //// Search & Results Stuff 
    _searchController = [[VLSearchController alloc] initWithSearchResultsController:nil]; 
    self.searchController.searchResultsUpdater = self; 

    [self.searchController.searchBar sizeToFit]; 
    self.searchController.searchBar.barTintColor = UIColorFromRGB(0x411229); 

    [self.sfView addSubview:self.searchController.searchBar]; 

    self.searchController.delegate = self; 
    self.searchController.dimsBackgroundDuringPresentation = NO; 
    self.searchController.searchBar.delegate = self; 
    self.definesPresentationContext = YES; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 

    [super viewDidAppear:animated]; 

    if (self.searchControllerWasActive) { 
     self.searchController.active = self.searchControllerWasActive; 
     _searchControllerWasActive = NO; 

     if (self.searchControllerSearchFieldWasFirstResponder) { 
      [self.searchController.searchBar becomeFirstResponder]; 
      _searchControllerSearchFieldWasFirstResponder = NO; 
     } 
    } 
} 

#pragma mark - UISearchBarDelegate 

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    [searchBar resignFirstResponder]; 
} 

#pragma mark - UISearchController 
- (void)willPresentSearchController:(UISearchController *)searchController 
{ 
    self.searchController.hidesNavigationBarDuringPresentation = false; // stop from animating 
    [self.navigationController setNavigationBarHidden:NO animated:YES]; 
    self.searchController.searchBar.showsCancelButton = false; 
} 

- (void)didDismissSearchController:(UISearchController *)searchController{ 
    filteredPics=_pics; 
} 

#pragma mark - UISearchResultsUpdating 

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {}; 

VLSearchController

@interface VLSearchController() 
@end 

@implementation VLSearchController{ 
    UISearchBar *_searchBar; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
} 

-(UISearchBar *)searchBar 
{ 

    if (_searchBar == nil) { 
     _searchBar = [[VLSearchBar alloc] initWithFrame:CGRectZero]; 
    } 
    return _searchBar; 
} 

    -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
     if ([searchBar.text length] > 0) { 
      self.active = true; 
     } else { 
      self.active = false; 
     } 
    } 
@end 

VLSearchBar

@implementation VLSearchBar 

-(void)setShowsCancelButton:(BOOL)showsCancelButton { 
    // Do nothing... 
} 

-(void)setShowsCancelButton:(BOOL)showsCancelButton animated:(BOOL)animated { 
    // Do nothing.... 
} 

@end 
+0

Соответствует ли вам стандарту 'UISearchResultsUpdating' и' UISearchBarDelegate'? –

+0

Да, я добавил протоколы в мой класс UIViewController. – user2253546

+0

Можете ли вы опубликовать полный код (связанный с UISearchController)? –

ответ

1

Похоже, вы устанавливаете делегат панели поиска в качестве своего экземпляра VLSearchController. Однако этот класс не соответствует протоколу UISearchBarDelegate. Я считаю, что вы хотите установить _searchBar.delegate = _searchBar, где вы внедрили свои методы делегирования.

Может быть только один делегат для searchBar, поэтому определите, какой класс вы хотите обрабатывать изменения текста и отображаете/скрываете кнопку отмены и соответственно устанавливаете делегат. Вы также устанавливаете делегат searchBar как UIViewController в свой метод viewDidLoad.

В общем, убедитесь, что вы правильно настроили всех своих делегатов, чтобы убедиться, что их методы вызываются.

Я считаю, что вам понадобится ваша переменная экземпляра, чтобы быть экземпляром вашего подкласса панели поиска.

+0

Хорошо. Поэтому я избавился от установки делегата _searchBar как VLSearchController. Я сохранил назначение делегата в viewDidLoad UIViewController. Я выбрал делегата как UIViewController, потому что я занимаюсь структурами данных, характерными для этого UIViewController. К сожалению, он все еще не работает. – user2253546

+0

Я не уверен, что означает ваше последнее утверждение ... Когда я создаю экземпляр VLSearchController, экземпляр VLSearchBar создается ... поэтому переменная экземпляра (VLSearchController) searchController имеет экземпляр VLSearchBar, доступный через: ** self.searchController .searchBar **, который является подклассом UISearchBar – user2253546

+0

, есть ли причина, по которой вы используете класс настраиваемого класса поиска и настраиваемый контроллер поиска, если все методы делегирования панели поиска будут реализованы в вашем UIViewController? если нет другой причины, вы можете попробовать удалить эти классы, поскольку они, похоже, ничего не делают, но инициализируют новую панель поиска, которая в любом случае создана в вашем контроллере представлений. – loudmouth

-1

вызова делегатов для подключения делегата к панель поиска. В таком случае

@property(nonatomic, assign) id<UISearchControllerDelegate>  _searchController; 


    _searchController = [[VLSearchController alloc]    
initWithSearchResultsController:nil]; 
self.searchController.searchBar.delegate = self; 
self.searchController.delegate = self; 


#pragma mark - UISearchBarDelegate 
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {} 

#pragma mark - UISearchController 
- (void)willPresentSearchController:(UISearchController *)searchController; 

#pragma mark - UISearchResultsUpdating 
- (void)updateSearchResultsForSearchController:(UISearchController 
*)searchController; 

Надеюсь, что это поможет вам, если не извините, но это должно сработать в приятный день! =)

+0

У меня есть панель поиска, добавленная программно. Поэтому соединение несуществующей строки поиска в файле xib с ее делегатом в IB не поможет. В коде, который я опубликовал, я программировал делегатов. спасибо за попытку, хотя :) – user2253546

+0

эй ты мог бы мне поправить, хотя мне нужно получить еще репутацию? плохо исследовать проблему, которую вы, возможно, придется добавить в IB, и вместо этого сделать для нее свойство ib. –

+0

Вы все же можете редактировать свойства панели поиска, просто придать ей имя класса, а также обратиться к нему, чтобы он знал, что взять от –

0

Я нашел решение своей проблемы. Решение состоит в том, чтобы переместить следующий метод делегата:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    [searchBar resignFirstResponder]; 
} 

в VLSearchController и установка _searchBar.delegate=self внутри VLSearchController-х -(UISearchBar *)searchBar.

Смежные вопросы