Frage

ich eine UISearchBar in meiner Schnittstelle habe und ich möchte das Verhalten der kleinen Löschtaste anpassen, die in der Suchleiste angezeigt, nachdem einiger Text (es ist ein kleiner grauer Kreis mit einem Kreuz darin eingegeben wurde, erscheint auf der rechten Seite des Suchfeldes).

Im Grunde möchte ich es nicht nur den Text der Suchleiste löschen (die die Standardimplementierung ist), sondern auch einige andere Sachen von meiner Schnittstelle zu löschen, aber einer meiner eigenen Methoden aufrufen.

Ich kann nichts in der Dokumentation für die UISearchBar Klasse oder das UISearchBarDelegate Protokoll finden -. Es sieht nicht wie Sie direkt Zugriff auf dieses Verhalten bekommen

Das einzige, was ich zur Kenntnis tat, war, dass die Dokumentation erklärt, dass die delegierte Methode:

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

wird aufgerufen, nachdem die Löschtaste abgegriffen wird.

Ich schrieb zunächst einige Codes in dieser Methode, dass die Suchleiste der Texteigenschaft geprüft, und wenn es leer ist, dann war es gelöscht wurde und alle meine andere Sachen zu tun.

Zwei Probleme, die diese aber:

Zum einen aus irgendeinem Grund kann ich nicht begreifen, auch wenn ich die Suchleiste zu ResignFirstResponder am Ende meiner Methode, etwas sagen, irgendwo wird es wieder zu becomeFirstResponder Einstellung. Wirklich ärgerlich ...

Zweitens, wenn der Benutzer die Löschtaste nicht verwendet, und löscht einfach den Text in der Bar der Löschtaste auf der Tastatur verwendet, wird diese Methode feuert und ihre Suchergebnisse gehen weg. Nicht gut.

Jede Beratung oder Zeiger in der richtigen Richtung wäre toll!

Danke!

War es hilfreich?

Lösung

Die Antwort, die angenommen wurde, ist falsch. Dies kann getan werden, habe ich es einfach aus und veröffentlichte sie in einer anderen Frage:

UISearchBar clearButton zwingt die Tastatur zu erscheinen

Best

Andere Tipps

Fand die bessere Lösung für dieses Problem:)

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

Ich habe diesen Code in meiner app bekam. Der Unterschied ist, dass ich nicht ‚live search‘ unterstützen, sondern die Suche starten, wenn der Benutzer die Suchtaste auf der Tastatur berührt:

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

Swift Version schließen Tastatur auf Löschtaste klicken Handhabung:

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

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

Ich würde vorschlagen, die rightView und rightViewMode Methoden der UITextField mit Ihrer eigenen Löschtaste erstellen, die das gleiche Bild verwendet. Ich gehe davon aus natürlich, dass UISearchBar Sie die UITextField innerhalb darauf zugreifen lassen. Ich denke, es wird.
Beachten Sie diese aus der iPhone O 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.

So werden Sie wahrscheinlich müssen auch die Original-Clear-Taste deaktivieren.

Da dieser ersten aufkommt, und soweit ich die Frage sehen war nicht wirklich angemessen behandelt, dachte ich, dass ich meine Lösung veröffentlichen würde.

1) Sie müssen einen Verweis auf das Textfeld innerhalb des SearchBar bekommen 2) Sie müssen diese Textfield ist klar zu fangen, wenn sie abfeuert.

Das ist ziemlich einfach. Hier ist eine Möglichkeit.

a) Stellen Sie sicher, dass Sie Ihre Klasse eine machen, da Sie in der Suchleiste die delegierte Methode der Textfield verwenden werden. b) Verbinden Sie auch Ihre SearchBar zu einem Outlet in Ihrer Klasse. Ich habe gerade mein SearchBar genannt. c) von viewDidLoad wollen Sie Ahold das Textfeld innerhalb des SearchBar zu bekommen. Ich habe es so.

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

Beachten Sie, zugewiesen ich einen Tag dieser Textfield, so dass ich es wieder greifen kann, und ich habe es ein Textfeld delegieren. Sie könnten eine Eigenschaft erstellt haben und diese Textfield zu dieser Eigenschaft zugewiesen es später zu packen, aber ich habe einen Tag.

Von hier aus brauchen Sie nur die delegierte Methode aufzurufen:

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

}

Das ist es. Da Sie zu einem privaten ValueForKey beziehen kann ich nicht garantieren, dass es nicht, dass Sie in Schwierigkeiten geraten wird.

Sie könnten versuchen, diese:

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

Beste Lösung aus meiner Erfahrung ist nur einen UIButton (mit klarem Hintergrund und ohne Text) setzt über dem System Löschtaste und als Verbindung eine 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];

}

Es wurde eine Lösung nicht in der Lage, hier zu finden, das nicht über ein eigenes API verwendet hat oder nicht Beweis Upgrade einhüllen Apple die Ansicht Struktur des UISearchBar ändert. Hier ist, was ich geschrieben habe, 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;
}

Dann das UITextFieldDelegate Protokoll in Ihrer Klasse implementieren und die textFieldShouldClear überschreiben. Methode

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

Edit: Einstellen der Delegierten auf dem Textfeld einer Suchleiste in iOS8 einen Absturz erzeugen. Allerdings sieht es aus wie die SearchBar: textDidChange. Methode wird auf iOS8 auf klares gecallt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top