Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to override "searchBar" property in subclass of UISearchController?

I have the problem like this: Hide UISearchBar Cancel Button

I have subclassed UISearchController and UISearchBar, and override methods layoutSubviews in UISearchBar.

How to override searchBar property with custom UISearchBar in my custom UISearchController?

Update 1

To implement property with custom UISearchBar i do in MyUISearchController:

@property(nonatomic, strong, readonly) UISearchBar *searchBar;

And

@synthesize searchBar=_searchBar;

- (UISearchBar *)searchBar {
    return [MySearchBar new];
}

But UISearchController uses default searchBar anyway..

Update

In h file:

@interface MySearchController : UISearchController <UITableViewDelegate, UITableViewDataSource>

In m file:

@interface MySearchController () <UISearchDisplayDelegate, UISearchControllerDelegate,
UISearchBarDelegate, UISearchResultsUpdating, SearchAutocompleteLoader>

@property UISearchController *searchController;

@property (strong, nonatomic) UITableView *searchResultTable;
@property UIView *viewForSearchBar;
@property (nonatomic) NSInteger filterSettings;
@property (strong, nonatomic) UILabel *matchesLabel;
@property (strong, nonatomic) UIView *loading;
@property (strong, nonatomic) UIView *foggView;

@end

- (instancetype)initWith:(UIView *)viewForSearch foggView:(UIView *)view delegate:(id)delegate andResultTableView:(UITableView *)tableView
{
    self.viewForSearchBar = viewForSearch;
    self.searchResultTable = tableView;
    self.foggView = view;
    self.searchDelegate = delegate;
    [self configureSearchController];
    return self;
}

- (void)configureSearchController {
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];

    self.searchController.searchResultsUpdater = self;
    self.searchController.delegate = self;
    self.searchController.hidesNavigationBarDuringPresentation = NO;
    self.searchController.dimsBackgroundDuringPresentation = NO;
    [self loadFilterSettings];
    self.searchController.searchBar.delegate = self;
    [self.searchController.searchBar setShowsCancelButton:NO];
    //self.searchController.searchBar.searchBarStyle = UISearchBarStyleDefault;

    [self.searchController.searchBar setBackgroundImage:[UIImage imageWithCGImage:(__bridge CGImageRef)([UIColor clearColor])]];
    [self.searchController.searchBar setImage:[UIImage imageNamed:@"iconSearchSettings"] forSearchBarIcon:UISearchBarIconBookmark state:UIControlStateNormal];
    self.searchController.searchBar.frame = CGRectMake(0, 0, self.view.frame.size.width, self.viewForSearchBar.frame.size.height);
    self.viewForSearchBar.tintColor = [UIColor yellowColor];
   // [self.viewForSearchBar addSubview:self.searchController.searchBar];

    self.searchController.searchBar.barTintColor = [UIColor whiteColor];
    self.searchController.searchBar.tintColor = [UIColor blackColor];
    //self.searchController.searchBar.backgroundColor = [UIColor whiteColor];

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

    for (UIView *subView in self.searchController.searchBar.subviews) {
        if ([subView isKindOfClass:[UITextField class]]) {
            [subView setTintColor:[UIColor blueColor]];
            [[(UITextField *) subView valueForKey:@"textInputTraits"] setValue:[UIColor blueColor] forKey:@"insertionPointColor"];
        }
    }

    [self.searchController setActive:YES];
    [self.searchController setActive:NO];
}
like image 701
Gikas Avatar asked Sep 02 '16 09:09

Gikas


2 Answers

UISearchController's searchBar is a computed property, you have to store your custom searchBar and return it when call searchBar.

Here is some code in Swift:

var mySearchBar = MySearchBar()

override var searchBar: UISearchBar {
    get{
        return mySearchBar;
    }
}
like image 136
wj2061 Avatar answered Nov 08 '22 04:11

wj2061


In order to customize the searchBar property begin the customization process by subclassing first the search bar (UISearchBar). Then, use this custom search bar in the subclass of the search controller, and at the end use both of them in the your ViewController class.

Refer this tutorial: UISearchController Customization

like image 27
Himz Avatar answered Nov 08 '22 03:11

Himz