webentwicklung-frage-antwort-db.com.de

Kann ich mich in die Suchleisten-Löschtaste einhängen?

Ich habe eine UISearchBar in meiner Benutzeroberfläche und möchte das Verhalten der kleinen Löschschaltfläche anpassen, die in der Suchleiste angezeigt wird, nachdem ein Text eingegeben wurde (es ist ein kleiner grauer Kreis mit einem Kreuz darin, der rechts angezeigt wird Seite des Suchfeldes).

Grundsätzlich möchte ich, dass nicht nur der Text der Suchleiste gelöscht wird (dies ist die Standardimplementierung), sondern auch einige andere Elemente aus meiner Benutzeroberfläche gelöscht werden, aber eine meiner eigenen Methoden aufgerufen wird.

Ich kann in den Dokumenten für die UISearchBar-Klasse oder das UISearchBarDelegate-Protokoll nichts finden - es scheint nicht, dass Sie direkt auf dieses Verhalten zugreifen können.

Die einzige Sache, die ich feststellte, war, dass die Dokumente die Delegat-Methode erklärten:

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

wird aufgerufen, nachdem die Löschtaste gedrückt wurde.

Ich schrieb anfangs etwas Code in diese Methode, der die Texteigenschaft der Suchleiste überprüfte, und wenn er leer war, war er gelöscht worden, um alle meine anderen Sachen zu erledigen.

Zwei Probleme, bei denen dies jedoch der Fall ist:

Erstens kann ich aus irgendeinem Grund nicht herausfinden, obgleich ich der Suchleiste am Ende meiner Methode den Befehl resignFirstResponder ansagt, irgendetwas, irgendwo wird es wieder als FirstResponder festgelegt. Ziemlich nervig...

Zweitens: Wenn der Benutzer die Schaltfläche "Löschen" nicht verwendet und den Text in der Leiste einfach mit der Schaltfläche "Löschen" auf der Tastatur löscht, wird diese Methode ausgelöst und die Suchergebnisse werden gelöscht. Nicht gut.

Jeder Rat oder Hinweis in die richtige Richtung wäre toll!

Vielen Dank!

35
Jasarien

Die akzeptierte Antwort ist falsch. Dies kann gemacht werden, ich habe es gerade herausgefunden und in einer anderen Frage gepostet:

UISearchbar clearButton zwingt die Tastatur zu erscheinen

Beste

11
boliva

Die bessere Lösung für dieses Problem gefunden :)

- (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];   
}
17

Ich habe diesen Code in meiner App. Der Unterschied ist, dass ich keine Live-Suche unterstütze, sondern stattdessen die Suche beginne, wenn der Benutzer die Suchtaste auf der Tastatur berührt:

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

Schnelle Versionsverwaltung Schließen Sie die Tastatur mit einem einfachen Klicken:

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

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

Da dies an erster Stelle steht und soweit ich die Frage nicht wirklich adäquat beantworten konnte, dachte ich, ich würde meine Lösung posten.

1) Sie benötigen einen Verweis auf das Textfeld in der Suchleiste 2) Sie müssen dieses TextFeld löschen, wenn es ausgelöst wird.

Das ist ziemlich einfach. Hier ist ein Weg. 

a) Stellen Sie sicher, dass Sie Ihre Klasse zu a machen, da Sie die Delegate-Methode von textField in der searchBar verwenden. b. Verbinden Sie Ihre searchBar außerdem mit einem Outlet in Ihrer Klasse. Ich habe gerade meine searchBar angerufen . C) von viewDidLoad aus wollen Sie das textField in die searchBar bekommen. Ich habe es so gemacht.

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

Beachten Sie, dass ich diesem textField ein Tag zugewiesen habe, damit ich es erneut greifen kann, und ich habe es zu einem textField-Delegierten gemacht. Sie hätten eine Eigenschaft erstellen und dieser Eigenschaft textField zuweisen können, um sie später wieder zu übernehmen, aber ich habe ein Tag verwendet.

Von hier aus müssen Sie nur die Delegat-Methode aufrufen:

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

}

Das ist es. Da Sie sich auf einen privaten valueForKey beziehen, kann ich nicht garantieren, dass Sie nicht in Schwierigkeiten geraten.

1
smileBot

Sie könnten dies versuchen:

- (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;
}
1
Denis Redis

Ich würde vorschlagen, die Methoden rightView und rightViewMode von UITextField zu verwenden, um eine eigene Schaltfläche zum Löschen zu erstellen, die dasselbe Bild verwendet. Ich gehe natürlich davon aus, dass Sie mit UISearchBar auf das darin enthaltene UITextField zugreifen können. Ich denke, es wird.
Beachten Sie dies in der iPhone OS Reference Library:

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.

Daher müssen Sie wahrscheinlich auch die ursprüngliche Löschtaste deaktivieren.

1
Andrew

Konnte hier keine Lösung finden, die keine private API oder kein Upgrade-Proof verwendet, falls Apple die Ansichtsstruktur der UISearchBar ändert. Folgendes habe ich geschrieben, das funktioniert:

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

Implementieren Sie dann das UITextFieldDelegate-Protokoll in Ihrer Klasse und überschreiben Sie die textFieldShouldClear: -Methode.

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

Bearbeiten: Wenn Sie den Stellvertreter im Textfeld einer Suchleiste in iOS8 festlegen, führt dies zum Absturz. Es sieht jedoch so aus, als würde die searchBar: textDidChange: Methode auf iOS8 auf clear aufgerufen werden.

0
Steven Mattera

Die beste Lösung aus meiner Erfahrung ist, einfach einen UIButton (mit klarem Hintergrund und ohne Text) über die Schaltfläche zum Löschen des Systems zu setzen und eine IBAction anzuschließen

- (IBAction)searchCancelButtonPressed:(id)sender {

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

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

}
0
Peter Lapisu