0

Ich habe UISearchBar, und ich möchte einen anderen UIViewController anzeigen, wenn ich auf Search button von UISearchBar klicke. Ich verwende folgende Methode dafür:Angezeigte Animation von UIViewController, die von pushViewController aufgerufen wird, die zweimal angezeigt wird

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" 
                 bundle:nil]; 
    UIViewController *add = 
    [storyboard instantiateViewControllerWithIdentifier:@"mainMenuViewController"]; 

    [self.navigationController pushViewController:add animated:YES]; 
} 

Problem ist, dass die erscheinen Animation des UIViewController zweimal aufgerufen wird. Ich sehe zweimal den Schieber des alten Controllers von rechts nach links.

Nun, wenn ich den gleichen Code verwenden, um neue Controller anzuzeigen, wenn auf einige reguläre UIButton geklickt wird, ist das Animationsproblem verschwunden. Es scheint also irgendwie mit UISearchBar verwandt zu sein.

Die Delegate-Methode von searchBarSearchButtonClicked wird nur einmal aufgerufen.

Der Code zum Reproduzieren des Problems ist sehr minimal, möglicherweise werde ich später ein Beispielprojekt Bit anhängen.

Aber die UIViewController mit Suchleiste sieht wie folgt aus:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 100, 20)]; 
    searchBar.placeholder = NSLocalizedString(@"search a pub or a place", nil); 
    searchBar.delegate = self; 
    [self.navigationItem setTitleView:searchBar]; 

} 

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    DLog(@"Filter searchBarSearchButtonClicked"); 
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" 
                 bundle:nil]; 
    UIViewController *add = 
    [storyboard instantiateViewControllerWithIdentifier:@"mainMenuViewController"]; 

    [self.navigationController pushViewController:add animated:YES]; 
} 

Problem ist sowohl auf iOS 8 und 9.

Edit:

ich hochgeladen Beispielprojekt here. Es ist sehr minimalistisch.

Edit2:

Wenn ich den Controller wie diese präsentieren, nicht durch Navigation-Controller, wird die Animation nur einmal angezeigt. (Es ist eine andere Animation - von unten nach oben war die vorherige von rechts nach links). Aber ich muss es über den Navigationscontroller tun. Das Problem scheint also mit UISearchBar Search clicked + Navigation Controller zu tun zu haben.

[self presentViewController:add 
        animated:YES 
       completion:nil]; 

Natürlich kann ich es auch so ohne Animation nennen:

[self.navigationController pushViewController:add animated:NO]; 

Aber was, wenn ich eine Animation wollen.

Edit3:

Ich habe versucht zweite Controller über segue angezeigt werden, aber es hat nicht geholfen.

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    [self performSegueWithIdentifier:@"seg1" sender:self]; 
} 

Edit4:

ich diesen Fehler an Apple gemeldet haben, weil ich diese erraten Fehler in UIKit sein muss. Wie auch immer, wenn jemand einen Workaround findet, wäre es gut.

+0

Vielleicht wird etwas mit der Entlassung eines UISearchController verwechselt. Eine Sache, die Sie versuchen sollten, wäre, Ihren Button-Delegate-Code in eine Methode mit einer einfachen Signatur zu verschieben und sie dann mit 'self performSelector' aufzurufen. – danh

+0

danke für die idee, ich habe es versucht, aber das problem ist immer noch da. – luky

Antwort

1

Ich finde nichts in der Dokumentation, die eine Suchleiste als Navigationselement titleView ist verboten, aber das ist die Ursache für die unerwünschte Animation.

Fügen Sie die Schaltfläche als Unteransicht hinzu, und beim Push wird eine einzelne Animation angezeigt. Eine schnelle Lösung ist es, es zu entfernen, bevor Sie mit der Präsentation fortfahren ...

Seltsamerweise behebt dies das zusätzliche Animationsproblem, entfernt aber nicht die Suchleiste. Die Überprüfung des TitelViews direkt nach dem Entfernen zeigt, dass die Suchleiste immer noch da ist.

+0

Toller Fang! Also weiß ich nicht, ob ich mich auf diese hacky Lösung verlassen sollte, da es auch fehlerhaft aussieht (wenn es die Ansicht nicht entfernt) - aber es funktioniert, ja. Welche Schaltfläche könnte ich als Unteransicht hinzufügen und wo? – luky

+0

kann ich auf diese hacky Lösung verlassen, wie wenn es in Moment der Kompilierzeit funktioniert, wird es für immer funktionieren unabhängig davon, ob Apple das Entfernen in einer zukünftigen Version reparieren wird oder nicht. Ich bin nicht sicher. Hängt davon ab, ob UIKit mit einer kompilierten App verknüpft oder dynamisch aufgerufen wird. – luky

+0

Ich bin froh, dass es hilfreich war. Die Art und Weise, wie ich damit umgehen würde, ist, den UISearchController wie in den Dokumenten empfohlen zu verwenden. Der hier vorgeschlagene Hack soll den Original-Hack der Suchleiste als Titelansicht umgehen. – danh