2013-01-03 5 views
5

Je veux changer l'apparence de UISearchBar: Alors,faire UITextField de fonctionner comme UISearchBar

S'il y a une façon dont je peux faire mon UITextField (en arrière-plan personnalisé pour la recherche) pour fonctionner comme UISearchBar? ou sous-classement et dépassant le - (void)layoutSubviews est le seul moyen?

Dites-le avec soin Comment le sous-classer !!!

Répondre

6

vous pouvez changer l'arrière-plan UISearchBar en utilisant ce code ci-dessous ..

for (UIView *subview in searchBar.subviews) { 
     if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) { 
      UIView *bg = [[UIView alloc] initWithFrame:subview.frame]; 
      bg.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"SkyBackground.jpeg"]]; 
      [searchBar insertSubview:bg aboveSubview:subview]; 
      [subview removeFromSuperview]; 
      break; 
     } 
    } 

De ce code, vous pouvez définir l'image ou toute autre chose pour le fond de UISearchBar.

Voir aussi ma cette réponse avec une autre fonctionnalité pour modifier la mise en page des composants searchbar .. How to change inside background color of UISearchBar component on iOS

MISE À JOUR:

pour changer l'apparence de bouton Annuler utiliser ce code ci-dessous ...

UIButton *cancelButton = nil; 

    for(UIView *subView in searchBar.subviews) 
    { 
     if([subView isKindOfClass:[UIButton class]]) 
     { 
      cancelButton = (UIButton*)subView; 
      //do something here with this cancel Button 
     } 
    } 
+0

il change l'arrière-plan, mais la taille et textfield et la loupe et le bouton annuler sont toujours là. C'est pourquoi je voulais un champ de texte personnalisé pour agir comme UIseachBar – Nil

+0

il suffit de définir l'arrière-plan tout effacer et aussi pas capable d'afficher le bouton Annuler .. Means activé = NON –

+0

juste comme juste [searchBar setShowsCancelButton: NO]; Utilisez cette ligne pour masquer le bouton Annuler et juste faire quelque chose avec ce code, vous obtiendrez la sortie que vous voulez ,,, voir aussi ma réponse que je poste le lien ci-dessus .. vous pouvez obtenir quelque chose de cela .. espérons que cela vous a aidé. –

1

Essayez cette

self.TextFieldSearch = (UITextField *)[self.Search.subviews lastObject]; 
    [self.TextFieldSearch removeFromSuperview]; 
    [self.view addSubview:self.TextFieldSearch]; 
    self.TextFieldSearch.delegate = self; 
    self.TextFieldSearch.font = [UIFont systemFontOfSize:10]; 
    self.TextFieldSearch.keyboardAppearance = UIKeyboardAppearanceAlert; 
    [self.Search removeFromSuperview]; 
0

La modification de l'arrière-plan UIsearchBar est un moyen d'obtenir un UISearchBar personnalisé. Mais si vous voulez une fonctionnalité limitée de recherche dans une table, vous pouvez avoir un champ de texte normal et un bouton de recherche pour filtrer les résultats de tableview dans un autre tableau et mettre à jour les tabledata avec ce tableau.

UISearchBar de - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText est presque équivalent à UItextField's valieChanged IBAction

6

Il est aussi possible en utilisant UITextFieldDelegates

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{  
NSString *searchString; 
if (string.length > 0) {   
    searchString = [NSString stringWithFormat:@"%@%@",textField.text, string]; 
} else { 
    searchString = [textField.text substringToIndex:[textField.text length] - 1]; 
} 
NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchString]; 
resultArray = [[resultTempArray filteredArrayUsingPredicate:filter] mutableCopy]; 

if (!searchString || searchString.length == 0) { 

    resultArray = [resultTempArray mutableCopy]; 
} else { 
    if (resultArray.count == 0) { 
NSLog(@"No data From Search"); 
    } 
}  
[tableView reloadData];  
return YES; 
} 
+0

thnQ mec réellement je l'ai la même idée mais pas encore implémentée mais après avoir vu la tienne seulement je me suis confirmé que mon idée est correcte et aussi qu'il y a un petit changement près de CONTAINS ça devrait être SELF CONTAINS sinon ça va planter ..... – ashokdy

0

Ok, je suis le même problème, et je UISearchBar sous-classé! Ici, vous allez

- (void) layoutSubviews { 

[super layoutSubviews]; 
UITextField *searchField = nil; 
    for (UIView *subview in self.subviews) { 
     if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) { 
      [subview removeFromSuperview]; 
     } 

     if ([subview isKindOfClass:[UITextField class]]) { 
      searchField = (UITextField *)subview; 
      searchField.leftViewMode = UITextFieldViewModeNever; 
      [searchField setValue:[UIFont systemFontOfSize:8] forKeyPath:@"_placeholderLabel.font"]; 
      [searchField setBackground: [UIImage imageNamed:@"images.png"] ]; 
       searchField.clearButtonMode = UITextFieldViewModeNever; 
     } 

} 
self.showsCancelButton = NO; 
} 

When entering text

1

filtrage en utilisant des méthodes de délégué UITextField

#pragma mark - UITEXTFIELD DELEGATE METHODS - 

- (BOOL)textFieldShouldReturn:(UITextField *)textField{ 
    [textField resignFirstResponder]; 
    return YES; 
} 

- (BOOL)textFieldShouldClear:(UITextField *)textField{ 
    arrFilterSearch = nil; 
    arrFilterSearch = [NSMutableArray arrayWithArray:arrSearch]; 
    UITableView *tblView = (UITableView *)[self.view viewWithTag:tblView_Tag]; 
    [tblView reloadData]; 
    return YES; 
} 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 
    NSString *searchKey = [textField.text stringByAppendingString:string]; 
    arrFilterSearch = nil; 
    searchKey = [searchKey stringByReplacingCharactersInRange:range withString:@""]; 
    if (searchKey.length) { 
      NSPredicate *pred = [NSPredicate predicateWithFormat:@"firstname contains[cd] %@", searchKey]; 
      arrFilterSearch = [NSMutableArray arrayWithArray:[arrSearch filteredArrayUsingPredicate:pred]]; 
    } 
    else 
     arrFilterSearch = [NSMutableArray arrayWithArray:arrSearch]; 

    UITableView *tblView = (UITableView *)[self.view viewWithTag:tblView_Tag]; 
    [tblView reloadData]; 
    return YES; 
} 
Questions connexes