UISearchBar - ReturnKeyType not working for iOS 8

2020-06-21 05:18发布

I am using UISearchbar in tableview controller in storyboard. And searchbar returnKeyType is UIReturnKeySearch.

enter image description here

Its working fine with iOS7 but returnKeyType is not working with iOS8. in iOS8, return key appears every time in keyboard. I tried to set returnkeytype in viewDidLoad method of controller too. What I need to do to set returnKeyType = UIReturnKeySearch in iOS8?

5条回答
叛逆
2楼-- · 2020-06-21 05:33

try this in viewDidLoad:

UITextField *txfSearchField = [yourSearchbar valueForKey:@"_searchField"];

    if([txfSearchField conformsToProtocol:@protocol(UITextInputTraits)]) {
       [txfSearchField setReturnKeyType:UIReturnKeyDefault];
    } 
查看更多
Fickle 薄情
3楼-- · 2020-06-21 05:40

I think you can go with your hard codded logic for right now. I will update if I will get better solution for your problem.

-(void)viewDidLoad {
    [self setReturnKeyTypeSearchForView:searchBar];
}

-(void)setReturnKeyTypeSearchForView:(UIView *)view
{
    for (id subView in view.subviews) {
        if ([subView isKindOfClass:[UITextField class]]) {
            [subView setReturnKeyType:UIReturnKeySearch];
        }
        else {
            [self setReturnKeyTypeSearchForView:subView];
        }
    }
    if ([view isKindOfClass:[UITextField class]]) {
        [(UITextField *)view setReturnKeyType:UIReturnKeySearch];
    }
}
查看更多
太酷不给撩
4楼-- · 2020-06-21 05:42

Try making IBOutlet of your SearchBar

@property (weak, nonatomic) IBOutlet UISearchBar *searchBar;

and add the below line code to your viewDidLoad Method

 // if u want Done return key and change accordingly.
_searchBar.returnKeyType = UIReturnKeyDone;
查看更多
别忘想泡老子
5楼-- · 2020-06-21 05:45

I'm not sure if I understood your question correctly. You want to have "search" button instead of "return" button, right? There is a new SearchController in ios 8, give it a try:

YourTableViewController.h

@interface YourTableViewController : UITableViewController<UISearchResultsUpdating>
@end

And now the implementation:

YourTableViewController.m

- (void)viewDidLoad {
// initializing with the same controller as presenting
UISearchController *searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
searchController.searchResultsUpdater = self;
searchController.searchBar.frame = CGRectMake(searchController.searchBar.frame.origin.x, searchController.searchBar.frame.origin.y, searchController.searchBar.frame.size.width, 44.0f);
searchController.dimsBackgroundDuringPresentation = NO;
searchController.searchBar.delegate = self;
searchController.searchBar.returnKeyType = UIReturnKeySearch; //should be search by default.. you can change to whatever you want.

// adding searchBar into HeaderView
self.tableView.tableHeaderView = searchController.searchBar;

// just to be able to present results on the same controller
self.definesPresentationContext = YES;
}

You also have to implement method from UISearchResultsUpdating protocol:

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
   // you can leave it blank
}

EDIT: If it is not what you were looking for please comment, so I can update my answer accordingly

查看更多
姐就是有狂的资本
6楼-- · 2020-06-21 05:54

SearchViewController.h

//
#import <UIKit/UIKit.h>

@interface SearchViewController : UIViewController
 <UISearchBarDelegate, UITableViewDataSource> {
    NSMutableArray *tableData;

    UIView *disableViewOverlay;

    UITableView *theTableView;
    UISearchBar *theSearchBar;
}

@property(retain) NSMutableArray *tableData;
@property(retain) UIView *disableViewOverlay;

@property (nonatomic, retain) IBOutlet UITableView *theTableView;
@property (nonatomic, retain) IBOutlet UISearchBar *theSearchBar;

- (void)searchBar:(UISearchBar *)searchBar activate:(BOOL) active;

@end

SearchViewController.m

//
#import "SearchViewController.h"

@implementation SearchViewController
@synthesize tableData;
@synthesize disableViewOverlay;
@synthesize theSearchBar;
@synthesize theTableView;


// Initialize tableData and disabledViewOverlay 
- (void)viewDidLoad {
    [super viewDidLoad];
    self.tableData =[[NSMutableArray alloc]init];
    self.disableViewOverlay = [[UIView alloc]
     initWithFrame:CGRectMake(0.0f,44.0f,320.0f,416.0f)];
    self.disableViewOverlay.backgroundColor=[UIColor blackColor];
    self.disableViewOverlay.alpha = 0;
}

// Since this view is only for searching give the UISearchBar 
// focus right away
- (void)viewDidAppear:(BOOL)animated {
    [self.theSearchBar becomeFirstResponder];
    [super viewDidAppear:animated];
}

#pragma mark -
#pragma mark UISearchBarDelegate Methods

- (void)searchBar:(UISearchBar *)searchBar
    textDidChange:(NSString *)searchText {
  // We don't want to do anything until the user clicks 
  // the 'Search' button.
  // If you wanted to display results as the user types 
  // you would do that here.
}

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
    // searchBarTextDidBeginEditing is called whenever 
    // focus is given to the UISearchBar
    // call our activate method so that we can do some 
    // additional things when the UISearchBar shows.
    [self searchBar:searchBar activate:YES];
}

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
    // searchBarTextDidEndEditing is fired whenever the 
    // UISearchBar loses focus
    // We don't need to do anything here.
}

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    // Clear the search text
    // Deactivate the UISearchBar
    searchBar.text=@"";
    [self searchBar:searchBar activate:NO];
}

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    // Do the search and show the results in tableview
    // Deactivate the UISearchBar

    // You'll probably want to do this on another thread
    // SomeService is just a dummy class representing some 
    // api that you are using to do the search
    NSArray *results = [SomeService doSearch:searchBar.text];

    [self searchBar:searchBar activate:NO];

    [self.tableData removeAllObjects];
    [self.tableData addObjectsFromArray:results];
    [self.theTableView reloadData];
}

// We call this when we want to activate/deactivate the UISearchBar
// Depending on active (YES/NO) we disable/enable selection and 
// scrolling on the UITableView
// Show/Hide the UISearchBar Cancel button
// Fade the screen In/Out with the disableViewOverlay and 
// simple Animations
- (void)searchBar:(UISearchBar *)searchBar activate:(BOOL) active{  
    self.theTableView.allowsSelection = !active;
    self.theTableView.scrollEnabled = !active;
    if (!active) {
        [disableViewOverlay removeFromSuperview];
        [searchBar resignFirstResponder];
    } else {
        self.disableViewOverlay.alpha = 0;
        [self.view addSubview:self.disableViewOverlay];

        [UIView beginAnimations:@"FadeIn" context:nil];
        [UIView setAnimationDuration:0.5];
        self.disableViewOverlay.alpha = 0.6;
        [UIView commitAnimations];

        // probably not needed if you have a details view since you 
        // will go there on selection
        NSIndexPath *selected = [self.theTableView 
            indexPathForSelectedRow];
        if (selected) {
            [self.theTableView deselectRowAtIndexPath:selected 
                animated:NO];
        }
    }
    [searchBar setShowsCancelButton:active animated:YES];
}


#pragma mark -
#pragma mark UITableViewDataSource Methods

- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section {
    return [tableData count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *MyIdentifier = @"SearchResult";
    UITableViewCell *cell = [tableView
     dequeueReusableCellWithIdentifier:MyIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] 
         initWithStyle:UITableViewCellStyleDefault 
         reuseIdentifier:MyIdentifier] autorelease];
    }

    id *data = [self.tableData objectAtIndex:indexPath.row];
    cell.textLabel.text = data.name;
    return cell;
}

#pragma mark -
#pragma mark Memory Management Methods

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];    
    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [theTableView release], theTableView = nil;
    [theSearchBar release], theSearchBar = nil;
    [tableData dealloc];
    [disableViewOverlay dealloc];
    [super dealloc];
}

@end

Building a SearchView with UISearchBar and UITableView

this might helps you :)

查看更多
登录 后发表回答