2014-06-05 27 views
6

enter image description hereenter image description hereW jaki sposób włączasz przycisk anulowania w pasku wyszukiwania po zwolnieniu klawiatury?

Próbuję osiągnąć ten sam efekt, co aplikacja Kontakty Apple (lewy zrzut ekranu). Przycisk anulowania w UISearchBar jest włączony, nawet gdy klawiatura jest odrzucona. Moja aplikacja zachowuje się inaczej (prawy zrzut ekranu). Przycisk anulowania jest automatycznie wyłączany po zwolnieniu klawiatury. Użytkownik jest zmuszony dotknąć przycisku anulowania jeden raz, aby go włączyć, a następnie innym razem, aby wywołać zwolnienie. To nie jest dobre doświadczenie dla użytkownika. Jak zawsze miałbym włączony przycisk anulowania, tak jak aplikacja Kontakty Apple?

Szczegóły techniczne:

nie używam UISearchDisplayController powodu pewnych wymagań projektowych. To tylko UISearchBar z moim własnym niestandardowym kontrolerem wyszukiwania. Przycisk anulowania jest wyświetlany za pomocą [self.searchBar showsCancelButton:YES animated:YES]. Klawiatura jest odrzucana przy użyciu [self.searchBar resignFirstResponder].

+0

solidnego odpowiedź, patrz tutaj: https://stackoverflow.com/questions/9968595/how-to-enable-cancel-button-with-uisearchbar/47617904#47617904 –

Odpowiedz

1

Można to zrobić:

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { 
    [self enableCancelButton]; 
} 

- (void)enableCancelButton { 
    for (UIView *view in _seachBar.subviews) { 
     if ([view isKindOfClass:[UIButton class]]) { 
      [(UIButton *)view setEnabled:YES]; 
     } 
    } 
} 

ALE jest to metoda dość hackish i jestem niemal pewien, to na ogół mile widziana przez Apple i może potencjalnie prowadzić do odrzucenia aplikacji. O ile mi wiadomo, nie ma innego sposobu robienia tego, co próbujesz zrobić.

2

Od czasu iOS 7 wszystkie wyrazy UISearchBar są o jeden poziom głębszy. To powinno zadziałać:

for (UIView *subView in searchBar.subviews) { 
    for (UIView *secondLevelSubview in subView.subviews) { 
     if ([view isKindOfClass:[UIButton class]]) { 
      [(UIButton *)view setEnabled:YES]; 
     } 
} 

Nadal hacky i może łatwo zepsuć się w następnej wersji iOS.

5

Za pomocą interfejsu API środowiska wykonawczego można uzyskać dostęp do przycisku anulowania.

UIButton *btnCancel = [self.searchBar valueForKey:@"_cancelButton"]; 
[btnCancel setEnabled:YES]; 

Jeśli chodzi o Twoje pytanie to dotyczy, nie ma sposobu, można włączyć przycisk Anuluj, kiedy klawiatura jest odwołany, podobnie jak nie ma zwrotna jako takie.

0

Wprowadź poniżej metodę searchBarShouldEndEditing delegate w kodzie. Mam nadzieję, że to będzie pomocne.

(BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar 
{ 
    [[searchBar valueForKey:@"_cancelButton"] setEnabled:YES]; 
    return YES; 
} 
+0

dla mnie, cancelButton jest wciąż włączony w tym momencie, więc nie pomaga włączać go tutaj. –

3

Wezwanie do [self.searchBar resignFirstResponder] uczyni przycisk Anuluj wyłączone. Dlatego zawsze należy aktualizować przycisk anulowania, aby włączyć po wywołaniu go.

Objective-C

[searchBar resignFirstResponder]; 
UIButton *cancelButton = (UIButton *)[searchBar valueForKey:@"cancelButton"]; 
[cancelButton setEnabled:YES]; 

Swift

searchBar.resignFirstResponder() 
if let cancelButton = searchBar.value(forKey: "cancelButton") as? UIButton 
    cancelButton.isEnabled = true 
} 

Z mojego doświadczenia wynika, view.endEditing(true) jest problem. Ponieważ jest również nazywany .resignFirstResponder, jeśli w widoku znajduje się UITextField, który jest zawarty w UISearchBar.

https://developer.apple.com/reference/uikit/uiview/1619630-endediting

1

Oto rekurencyjny rozwiązanie, które pracuje dla mnie.

func enableButtons(_ view:UIView) { for subView in view.subviews { enableButtons(subView) } if let buttonView = view as? UIButton { buttonView.isEnabled = true } }