Domanda

Ho un UISearchBar nella mia interfaccia e voglio personalizzare il comportamento del pulsante piccolo chiaro che appare nella barra di ricerca, dopo un certo testo è stato inserito (si tratta di un piccolo cerchio grigio con una croce in essa, appare sul lato destro del campo di ricerca).

In sostanza, lo voglio non solo per cancellare il testo della barra di ricerca (che è l'implementazione di default), ma per cancellare anche alcune altre cose dalla mia interfaccia, ma chiamando uno dei miei metodi.

Non riesco a trovare nulla nella documentazione per la classe UISearchBar o il protocollo UISearchBarDelegate -. Non sembra come è possibile ottenere direttamente l'accesso a questo comportamento

L'unica cosa che ho fatto notare è che i documenti hanno spiegato che il metodo delegato:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText;

è chiamato dopo che il pulsante chiaro è sfruttato.

Inizialmente ho scritto un codice in questo metodo che controllò proprietà di testo della barra di ricerca, e se fosse vuota, poi era stato cancellato e di fare tutte le mie altre cose.

Due problemi che questo, però:

In primo luogo, per qualche motivo non riesco a capire, anche se dico la barra di ricerca per resignFirstResponder alla fine del mio metodo, qualcosa, da qualche parte è l'impostazione di nuovo a becomeFirstResponder. Davvero fastidioso ...

In secondo luogo, se l'utente non utilizza il tasto chiaro, e semplicemente cancella il testo nella barra utilizzando il tasto CANC sulla tastiera, questo metodo è sparato fuori e loro risultati di ricerca andare via. Non va bene.

Qualche consiglio o puntatori nella giusta direzione sarebbe grande!

Grazie!

È stato utile?

Soluzione

La risposta che è stata accettata non è corretto. Questo può essere fatto, ho appena capito fuori e postato in un'altra domanda:

UISearchBar clearButton costringe la tastiera ad apparire

Best

Altri suggerimenti

Trovato la soluzione migliore per questo problema:)

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    if ([searchText length] == 0) {
        [self performSelector:@selector(hideKeyboardWithSearchBar:) withObject:searchBar afterDelay:0];
    }
}

- (void)hideKeyboardWithSearchBar:(UISearchBar *)searchBar{   
    [searchBar resignFirstResponder];   
}

Ho questo codice nella mia app. La differenza è che io non sostengo 'di ricerca dal vivo', ma invece avviare la ricerca quando l'utente tocca il pulsante di ricerca sulla tastiera:

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
    if ([searchBar.text isEqualToString:@""]) {
        //Clear stuff here
    }
}

Movimentazione stretta tastiera sul pulsante chiaro scatto versione Swift:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText.characters.count == 0 {
        performSelector("hideKeyboardWithSearchBar:", withObject:searchBar, afterDelay:0)
    }
}

func hideKeyboardWithSearchBar(bar:UISearchBar) {
    bar.resignFirstResponder()
}

Io suggerirei di usare i rightView e rightViewMode metodi di UITextField per creare il proprio pulsante chiaro che utilizza la stessa immagine. Sto assumendo, naturalmente, che UISearchBar vi permetterà di accedere al UITextField all'interno di esso. Penso che lo farà.
Essere consapevoli di questo dal sistema operativo Reference Library iPhone:

If an overlay view overlaps the clear button, however, the clear button always takes precedence in receiving events. By default, the right overlay view does overlap the clear button.

Quindi sarà probabilmente anche necessario disabilitare il pulsante originale chiaro.

Dal momento che questo viene in su prima, e per quanto posso vedere la questione non è stata affrontata in modo adeguato in realtà, ho pensato di postare la mia soluzione.

1) È necessario ottenere un riferimento al textField all'interno del SearchBar 2) È necessario prendere quel textField di chiaro quando spara.

Questo è abbastanza semplice. Ecco un modo.

a) Assicuratevi di effettuare la classe A, dal momento che si prevede di utilizzare il metodo delegato del textField all'interno della barra di ricerca. b) Inoltre, collegare il Searchbar ad una presa nella classe. Ho appena chiamato il mio SearchBar. c) da viewDidLoad si desidera ottenere ahold del textField all'interno della barra di ricerca. L'ho fatto in questo modo.

UITextField *textField = [self.searchBar valueForKey:@"_searchField"];
if (textField) {
    textField.delegate = self;
    textField.tag = 1000;
}

Si noti, ho assegnato un tag che textField modo che io possa prendere di nuovo, e mi ha fatto un delegato textField. Si potrebbe avere creato una proprietà e assegnato questo textField a quella proprietà per afferrare in un secondo momento, ma ho usato un tag.

Da qui è sufficiente chiamare il metodo delegato:

-(BOOL)textFieldShouldClear:(UITextField *)textField {
if (textField.tag == 1000) {
    // do something
    return YES;
}
return NO;

}

Questo è tutto. Dal momento che si fa riferimento ad un valueForKey privato non posso garantire che non vi nei guai.

Si potrebbe provare questo:

- (void)viewDidLoad
{
    [super viewDidLoad];
    for (UIView *view in searchBar.subviews){
        for (UITextField *tf in view.subviews) {
            if ([tf isKindOfClass: [UITextField class]]) {
                tf.delegate = self;
                break;
            }
        }
    }
}

- (BOOL)textFieldShouldClear:(UITextField *)textField {
     // your code
    return YES;
}

La migliore soluzione dalla mia esperienza è solo quello di mettere un UIButton (con sfondo chiaro e senza testo) al di sopra del pulsante di azzeramento sistema e di collegare un IBAction

- (IBAction)searchCancelButtonPressed:(id)sender {

    [self.searchBar resignFirstResponder];
    self.searchBar.text = @"";

    // some of my stuff
    self.model.fastSearchText = nil;
    [self.model fetchData];
    [self reloadTableViewAnimated:NO];

}

Non sono riuscito a trovare una soluzione qui che non ha utilizzato un'API private o non è stato aggiornare la prova in caso di Apple cambia la struttura vista del UISearchBar. Ecco quello che ho scritto che funziona:

- (void)viewDidLoad {
    [super viewDidLoad];

    UITextField* textfield = [self findTextFieldInside:self.searchBar];
    [textfield setDelegate:self];
}

- (UITextField*)findTextFieldInside:(id)mainView {
    for (id view in [mainView subviews]) {
        if ([view isKindOfClass:[UITextField class]]) {
            return view;
        }

        id subview = [self findTextFieldInside:view];
        if (subview != nil) {
            return subview;
        }
    }

    return nil;
}

Quindi implementare il protocollo UITextFieldDelegate nella tua classe e sovrascrivere il textFieldShouldClear:. Metodo

- (BOOL)textFieldShouldClear:(UITextField*)textField {
    // Put your code in here.
    return YES;
}

Modifica Impostazione il delegato sul campo di testo di una barra di ricerca in iOS 8 produrrà un incidente. Tuttavia sembra che la barra di ricerca: textDidChange:. Metodo verrà chiamato in iOS 8 su chiara

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top