2013-01-03 19 views
5

voglio cambiare l'aspetto di UISearchBar: Così,fare UITextField di funzionare come UISearchBar

Se c'è un modo con cui posso fare il mio UITextField (in uno sfondo personalizzato per la ricerca) per funzionare come UISearchBar? o la sottoclasse e l'override di - (void)layoutSubviews è l'unico modo?

Gentilmente dire Come sottoclasse !!!

risposta

6

è possibile modificare la UISearchBar sfondo utilizzando questo codice muggito ..

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

Da questo codice è possibile impostare un'immagine o qualsiasi altra cosa per lo sfondo del UISearchBar.

veda anche il mio questa risposta con qualche altra funzionalità per modificare il layout dei componenti searchbar .. How to change inside background color of UISearchBar component on iOS

UPDATE:

per il cambiamento il pulsante Annulla aspetto utilizzare questo codice muggito ...

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

cambia la dimensione del fondo, ma campo di testo e e la lente di ingrandimento e pulsante di annullamento sono ancora lì. Ecco perché volevo che un campo di testo personalizzato si comportasse come UiseachBar – Nil

+0

impostando tutto lo sfondo chiaro e non fosse possibile visualizzare il pulsante Annulla .. significa abilitato = NO –

+0

proprio come [searchBar setShowsCancelButton: NO]; usa questa linea per nascondere il pulsante cancella e fai semplicemente qualcosa con questo codice otterrai l'output che vuoi ,,, vedi anche la mia risposta che pubblico il link sopra .. puoi ottenere qualcosa da quello .. spero che ti sia stato d'aiuto. . :) –

1

Prova questo

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

Cambiare lo sfondo di UIsearchBar è un modo per ottenere un UISearchBar personalizzato. Ma se vuoi una funzionalità limitata di cercare una tabella puoi avere un campo di testo normale e collegare un pulsante di ricerca per filtrare i risultati di tableview in un altro array e aggiornare i tabledata con quella matrice.

UISearchBar di - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText è quasi equivalente a UItextField's valieChanged IBAction

6

sua possibile anche utilizzando 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 tizio in realtà ho la stessa idea ma non ancora implementata ma dopo aver visto la tua solo ho avuto conferma che la mia idea è corretta e inoltre c'è un piccolo cambiamento vicino CONTAINS dovrebbe essere SELF CONTAINS altrimenti andrà in crash ..... – ashokdy

0

Ok, ho avuto lo stesso problema, e io sottoclasse UISearchBar! Qui si va

- (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

Filtering utilizzando UITextField metodi delegato

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