2009-05-20 17 views
14

Ich bin nicht sicher, warum das so schwer ist. Ich habe eine UISearchBar oben auf meiner Seite. Wenn der Benutzer in diese UISearchBar eingibt, werden die Ergebnisse in der UITableView unterhalb der Suchleiste automatisch gefiltert. Es gibt keinen Suchknopf, da ich suche, wenn Tasten gedrückt werden. Der Ablauf der Anwendung besteht darin, dass der Benutzer eine Suche in die Suchleiste eingibt (mit der angezeigten Tastatur) und dann die Ergebnisse in der Tabellenansicht abrollt - an diesem Punkt muss die Tastatur verschwinden.Tastatur verstecken, wenn der Fokus ausfällt UISearchBar

Ich habe es schwer, die Tastatur verschwinden zu lassen.

Ich weiß, dass ich tun muss:

[searchBar resignFirstResponder]; 

die Tastatur zu bekommen, verschwinden, aber ich kann nicht finden, was Delegierten ich dies auf ausführen müssen. Ich möchte dies tun, sobald der Benutzer die Tabellenansicht berührt.

Irgendwelche Ideen?

+0

prüfen dies: http://stackoverflow.com/questions/7482266/resign-keyboard-when-losing-focus- on-uisearchbar – alternatiph

Antwort

1

Sie möchten es vielleicht tun, wie es Cydia (jailbroken packaging UI) tut - es gibt einen Suchknopf, und wenn Sie den Suchknopf drücken, schließt es die Tastatur. Die Ergebnisse werden weiterhin gefiltert, während Sie eine Vorschau eingeben.

+1

Dies würde das Drücken der Suchtaste erfordern, um die Tastatur zu entfernen - ein Schritt, der meiner Meinung nach unnötig sein sollte und Benutzer nur frustrieren könnte. Trotzdem danke. – rein

9

Versuchen Sie folgendes:

- (void)viewWillDisappear:(BOOL)animated { 

    [super viewWillDisappear:animated]; 

    [searchBar resignFirstResponder]; 

} 

Es funktionierte für mich

2

Ich denke, die einfachste (und beste) Weg, dies zu tun, ist Ihre globale Sicht zu Unterklasse und verwenden hitTest: withevent-Methode zu einem zuhören berühren. Touches auf der Tastatur sind nicht registriert, also hitTest: withEvent wird nur aufgerufen, wenn Sie/scroll/swipe/pinch ... woanders berühren und dann [self endEditing: YES] aufrufen.

Dies ist besser als die Verwendung von touchesBegan, da touchesBegan nicht aufgerufen wird, wenn Sie auf eine Schaltfläche oben auf der Ansicht klicken. Es ist auch besser, als einen abgedunkelten Bildschirm zu verwenden, da Sie in einer komplexen und dynamischen Benutzeroberfläche nicht überall einen dunklen Bildschirm platzieren können. Außerdem ist es besser, als [searchBar resignFirstResponder] aufzurufen, da Sie möglicherweise viele Textfelder auf dem Bildschirm haben, so dass dies für alle funktioniert.

0

Könnte super spät sein, um zu antworten, aber das könnte jedem in Zukunft helfen. Dieses bestimmte Stück Code arbeitete für mich. P.S. Ich besitze diese Lösung nicht, die ich vor einiger Zeit im Internet selbst gefunden habe.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
UITouch *touch = [[event allTouches] anyObject]; 
if ([self.srchBar isFirstResponder] && [touch view] != self.srchBar) 
{ 
    [self.srchBar resignFirstResponder]; 
} 
[super touchesBegan:touches withEvent:event]; 
} 
1

Da die Ergebnisse in einer Tabelle Ansicht sein werden, verwenden UIScrollView ‚s delegieren (auf die UITableView reagiert) Methode - (void)scrollViewDidScroll:(UIScrollView *)scrollView.

Sie benötigen Ihre View-Controller reagieren auf die UITableView ‚s Datenquelle und Delegierter haben (in der .h-Datei):

<UITableViewDataSource, UITableViewDelegate> 

als in Ihrem Initialisierungsverfahren in der .m Datei hinzufügen:

self.tableView.dataSource = self; 
self.tableView.delegate = self; 

Schließlich fügen diese Methode:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    [self.view endEditing:YES]; 
} 

Dadurch wird die UISearchBar Fokus verlieren, und die Tastatur wird ausgeblendet.

1

Eine Möglichkeit besteht darin, dass die UISearchBar zu einem Controller gehört, der in UIModalPresentationFormSheet angezeigt wird. Ich hatte das gleiche Problem und fand heraus, dass dies mit der Methode "disablesAutomaticKeyboardDismissal" von UIViewController zusammenhängt.

Die Apple documentation Zustände des folgend:

überschreibt diese Methode in einer Unterklasse zu ermöglichen oder die Abweisung der aktuellen Eingangsansicht (in der Regel des System Tastatur) nicht zuzulassen, wenn von einer Steuer ändert, die die Eingabe will Blick auf einen, der das nicht tut. Unter normalen Umständen, wenn der Benutzer ein Steuerelement antippt, das eine Eingabeansicht erfordert, zeigt das System diese Ansicht automatisch an. Durch Antippen in einem Steuerelement, das später keine Eingabeansicht anzeigen soll, wird die aktuelle Eingabeansicht zwar ausgeblendet, aber möglicherweise nicht in allen Fällen. Sie können diese Methode in diesen ausstehenden Fällen überschreiben, damit die Eingabe nicht mehr angezeigt wird, oder diese Methode verwenden, um zu verhindern, dass die Ansicht in anderen Fällen von gelöscht wird.

Die Standardimplementierung dieser Methode gibt JA, wenn die modale Präsentationsstil des View-Controller ist auf UIModalPresentationFormSheet und gibt NO für andere Präsentations Stile. Daher lässt das System normalerweise nicht zu, dass die Tastatur für modale Formulare abgewiesen wird.

In meinem Fall angezeigt ich die Suchleiste in der Navigationsleiste, so hatte ich eine Unterklasse von UINavigationViewController zu erstellen, die die Methode überschreibt wie folgt:

- (BOOL)disablesAutomaticKeyboardDismissal { 
    return NO; 
} 

Danach ResignFirstResponder schließlich das machen würde Tastatur verschwindet.

0

eine Ansicht mit einer searchBar Variable gegeben, fügen Sie diese Methode zur Ansicht:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? 
{ 
    if searchBar.isFirstResponder && !searchBar.point(inside: point, with: event){ 
     searchBar.resignFirstResponder() 
    } 
    return super.hitTest(point, with: event) 
} 
Verwandte Themen