Frage

Wer weiß, wie zu stornieren (First Responder Rücktritt) aus einem UISearchBar, wenn Sie unter dem Suchtextfeld tippen und über der Tastatur? Kann mir jemand helfen, einige Code schreiben zu handhaben?

Danke

War es hilfreich?

Lösung

Eine alternative Idee, die ich bekam von iphonedevbook , Beispielcode Projekt 04 war eine große transparente Schaltfläche zu verwenden, das liegt hinter allen anderen Kontrollen, die nichts tut, sondern alle Ersthelfer zurücktreten, wenn angezapft. D. h wenn der Benutzer tippt überall dort, wo es keine wichtigere Kontrolle ist - das ist die intuitive Verhalten -. die Suchleiste und Tastatur verschwindet

Andere Tipps

Fügen Sie eine Tippgeste in der übergeordneten Ansicht (des UISearchBar)

[self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:searchBar action:@selector(resignFirstResponder)]];

ich erreicht dies durch eine UITapGestureRecognizer mit:

UIGestureRecognizer* cancelGesture;

- (void) backgroundTouched:(id)sender {
    [self.view endEditing:YES];
}

#pragma mark - UISearchBarDelegate

-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
    cancelGesture = [UITapGestureRecognizer new];
    [cancelGesture addTarget:self action:@selector(backgroundTouched:)];
    [self.view addGestureRecognizer:cancelGesture];
}

-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
    if (cancelGesture) {
        [self.view removeGestureRecognizer:cancelGesture];
        [cancelGesture release];
        cancelGesture = nil;
    }
}

Der Code ist ein nackter, aber man kann die Absicht sehen. Wenn die SearchBar Bearbeitung beginnt, legen Sie eine Anzapfung Gestenerkenner der Ansicht des View-Controller, und entfernen Sie es, wenn es die Bearbeitung beendet.

Es gibt ein paar Einschränkungen, die Sie rund um arbeiten können: dies zu tun es machen wird, so, wenn Sie etwas klicken neben der Tastatur oder Textfeld des Suchleiste, die Erkennungs Fallen der Klick - wenn Sie also die klare verwenden, brechen, Umfang oder Ergebnisse Tasten sie nicht richtig reagiert.

In meinem speziellen Szenario hatte ich eine UITableView, die die freiliegende Fläche der Ansicht abdeckt, wurden so angebracht ich die Gestenerkenner, um es anstelle der Ansicht-Controller Hauptansicht, den Bereich zu isolieren, auf denen die Geste reagieren würde.

beendete ich mit einem Hybrid aus Haukes und Beau Scotts Ansatz auf. Es gab zwei Probleme, die ich lief ihre Lösungen in mit:

1) Wenn alles andere auf dem Bildschirm gibt es, Klopfen wird es in ResignFirstResponder nicht dazu führen, genannt zu werden. Zum Beispiel, wenn der Benutzer eine Taste, anstatt den Raum um die Schaltfläche tippt, isst die Taste, um das Ereignis. Beau Scotts Lösung behebt dieses Problem jedoch.

2) Tippen auf die Suchleiste selbst in ResignFirstResponder führen wird immer genannt. Offensichtlich Sie nicht wollen, um die Tastatur zu verschwinden, wenn Sie UISearchBar tippen. Eine kleine Änderung unten Adressen beschrieben dies.

ich am Ende meine Sicht der Einrichtung wie folgt. Die übergeordnete Sicht hat zwei Kinder - die UISearchBar und eine Subview, die den Rest meiner UI-Elemente enthalten. Die subview nimmt den gesamten Bildschirm unterhalb der UISearchBar auf. Dann habe ich Beau Scotts genauen Code hinzuzufügen und die Gestenerkenner zu entfernen, aber statt Zugabe self.view ich es dem Subview hinzugefügt:

IBOutlet UIView *gestureRecognizer;

...

-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
    cancelGesture = [UITapGestureRecognizer new];
    [cancelGesture addTarget:self action:@selector(backgroundTouch:)];
    [gestureRecognizer addGestureRecognizer:cancelGesture];
}

-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
    if (cancelGesture) {
        [gestureRecognizer removeGestureRecognizer:cancelGesture];
        [cancelGesture release];
        cancelGesture = nil;
    }
}

Zuerst müssen Sie einen Verweis auf die Suchleiste. Nehmen wir an, dass Ihr Controller-Objekt einen Objektverweis UISearchBar * theSearchBar hat, und dass Sie es zuweisen, wenn Sie das UISearchBar-Objekt erstellen.

Als nächstes müssen Sie erkennen, dass die enthaltende Ansicht berührt wurde. Die Ansicht, dass berührt wird „weiß“, aber Sie müssen diese Informationen an die Steuerung zu erhalten. Leider Apple nicht eine einfache Möglichkeit bieten, dies zu tun, aber es ist auch nicht so schwer.

Meine Lösung ist der Standard-UIView zu ersetzen, dass ein UIViewController Objekt normalerweise mit einem UIControl erzeugt und dann die UIViewController reagieren machen Ereignisse zu berühren.

MainController.m

- (void) loadView {
    UIControl *control = [[UIControl alloc] initWithFrame: <desired frame>];
[control addTarget: self action: @selector(touchUpInside) 
             forControlEvents: UIControlEventTouchUpInside];
       // or touch down events, or whatever you like
    self.view = control;
    [control release];
}

- (void) viewDidLoad {
    [super viewDidLoad];
    theSearchBar = [[UISearchBar alloc] initWithFrame: <desired frame>];

    // insert code to finish customizing the search bar

    [self.view addSubview: theSearchBar];
}

- (void) touchUpInside {
    if [theSearchBar isFirstResponder] {
        // grab any data you need from the search bar
        [theSearchBar resignFirstResponder];
    }
}

MainController.h

@interface MainController : UIViewController
{
    UISearchBar *theSearchBar;
}

Zur Verdeutlichung:

Es gibt nur ein einziges Objekt - lassen Sie sich die Klasse MainController nennen -, die eine Unterklasse von UIViewController ist. Alle der oben genannten Methoden in MainController umgesetzt werden aufgelistet. theSearchBar als UISearchBar * in der H-Datei deklariert.

definieren Sie die Ansicht und Controller mit Interface Builder? Wenn ja, ich schlage vor, Sie lernen, wie man es nicht verwenden - wenn Sie in die Art von Tricks bekommen wir hier diskutieren, wird es eher ein Hindernis als eine Hilfe - ich es nicht benutzen, immer <. / p>

@Gia Dang Antwort ist die einfachste, aber ich die UIView nicht Unterklasse, nur die UIViewController, so dass mein Ruf ist leicht anders. Auch, weil ich nicht weiß, den Aufwand für die tatsächlich Aufruf resignFirstResponder, ziehe ich es zuerst zu prüfen. Es ist mehr Code, aber da alles auf dem Haupt-Thread ausgeführt wird (was die UI verlangsamen kann), würde ich eher zuerst überprüfen.

@implementation MyController : UIViewController {
@private
    UISearchController *_uiSearchController;
}

- (void)viewDidLoad {
    // add tap on view to resign the responder if we're in the middle of typing in the search
    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyboardIfNeeded)];
    [self.view addGestureRecognizer:tapGestureRecognizer];
}

- (void)closeKeyboardIfNeeded {
    if (![_uiSearchController.searchBar isFirstResponder]) {
        return;
    }
    [_uiSearchController.searchBar resignFirstResponder];
}

@end

Wie bei den anderen Antworten, vorsichtig sein, ständig neu zu Objekten. Es gibt immer eine Leistung getroffen, ob es sich um die Schöpfung selbst ist oder die Garbage Collection durch ARC , und diese Dinge werden Ihre Hauptthread verlangsamen. Je nachdem, was Sie tun, auch auf der Haupt-Thread, kann es eine erhebliche Auswirkungen auf die Leistung haben.

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