2017-05-04 37 views
3

我在UITableView中添加了UISearchBar並將其添加到UIView之內。我在窗口上添加了UIView,一切正常。 searchBarShouldBeginEditing正在觸發並顯示日誌,但searchBarTextDidBeginEditing未觸發。下面是我的代碼:UISearchBar無響應

AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; 
self.frame = appDelegate.window.frame; 
[appDelegate.window addSubview:self]; 

myView.h

@property(strong, nonatomic) UISearchController *searchController; 

和內部myView.m

- (void)drawRect:(CGRect)rect { 
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; 
    self.searchController.searchResultsUpdater = self; 
    self.searchController.dimsBackgroundDuringPresentation = NO; 
    self.searchController.searchBar.delegate = self; 
    [self.searchController.searchBar sizeToFit]; 
    self.searchController.searchBar.userInteractionEnabled = YES; 
    tblDropdown.tableHeaderView = self.searchController.searchBar; 

    arrSeached = [NSMutableArray array]; 
} 
+0

https://www.google.com/search?q=searchBarTextDidBeginEditing&oq=searchBarTextDidBeginEditing&aqs=chrome..69i57j0l2.446j0j8&sourceid=chrome&ie=UTF-8# q = searchBarTextDidBeginEditing + not + –

+0

drawRect不得用於僅爲繪圖添加視圖。如果你想添加一個子視圖,你可以在視圖控制器的初始化器或viewDidLoad中完成 –

回答

0

也許,問題是,你的視圖控制器或視圖(我知道沒有所有代碼)沒有正確添加協議。

無論如何,這是使用一個UISearchController例如:

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating> 

@property (nonatomic, weak) IBOutlet UITableView * tableView; 
@property (nonatomic, strong) UISearchController * searchController; 
@property (nonatomic, strong) NSMutableArray * allItems; 
@property (nonatomic, strong) NSMutableArray * filteredItems; 
@property (nonatomic, weak) NSArray * displayedItems; 

@end 

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

@synthesize tableView; 
@synthesize searchController; 
@synthesize allItems; 
@synthesize displayedItems; 
@synthesize filteredItems; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Create a list 

    self.allItems = [[NSMutableArray alloc] init]; 
    [self.allItems addObject:@"One"]; 
    [self.allItems addObject:@"Two"]; 
    [self.allItems addObject:@"Three"]; 


    // Create a list to hold search results (filtered list) 
    self.filteredItems = [[NSMutableArray alloc] init]; 

    // Initially display the full list. This variable will toggle between the full and the filtered lists. 
    self.displayedItems = self.allItems; 

    // Here's where we create our UISearchController 

    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; 
    self.searchController.searchResultsUpdater = self; 
    self.searchController.searchBar.delegate = self; 

    [self.searchController.searchBar sizeToFit]; 

    // Add the UISearchBar to the top header of the table view 
    self.tableView.tableHeaderView = self.searchController.searchBar; 

    // Hides search bar initially. When the user pulls down on the list, the search bar is revealed. 
    [self.tableView setContentOffset:CGPointMake(0, self.searchController.searchBar.frame.size.height)]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section { 
    return [self.displayedItems count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)anIndexPath { 

    UITableViewCell * cell = [aTableView dequeueReusableCellWithIdentifier:@"FruitCell"]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] init]; 
    } 
    cell.textLabel.text = [self.displayedItems objectAtIndex:anIndexPath.row]; 
    return cell; 
} 

// When the user types in the search bar, this method gets called. 
- (void)updateSearchResultsForSearchController:(UISearchController *)aSearchController { 
    NSLog(@"updateSearchResultsForSearchController"); 

    NSString *searchString = aSearchController.searchBar.text; 
    NSLog(@"searchString=%@", searchString); 

    // Check if the user cancelled or deleted the search term so we can display the full list instead. 
    if (![searchString isEqualToString:@""]) { 
     [self.filteredItems removeAllObjects]; 
     for (NSString *str in self.allItems) { 
      if ([searchString isEqualToString:@""] || [str localizedCaseInsensitiveContainsString:searchString] == YES) { 
       NSLog(@"str=%@", str); 
       [self.filteredItems addObject:str]; 
      } 
     } 
     self.displayedItems = self.filteredItems; 
    } 
    else { 
     self.displayedItems = self.allItems; 
    } 
    [self.tableView reloadData]; 
} 


    @end