简体   繁体   中英

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];
}

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;
    }
}

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

import UIKit

class MySearchController: UISearchController {

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        searchBar.showsCancelButton = false
    }
}

See this one tutorial for customise the UISearchBar in Swift:

Customise UISearchBar

Objective - C : Add the code in ViewDidLoad. You have already declare object of UISearchBar

[searchBar setShowsCancelButton:NO]; 

Swift : in ViewDidLoad

searchBar.showsCancelButton = false

图片

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM