2010-06-16 4 views
23

Rechts, tippte abbrechen meine Frage zu beginnen, hier einige screenies des Problems bereits von der Spotify-App gelöst:Löschtaste (grau x) rechts von UISearchBar entfernen, wenn die Taste

Spotify Schritt 1: Norm UISearchBar befindet sich nicht im Bearbeitungsmodus.

Step 1 http://i49.tinypic.com/wbtpwi.png

Spotify Schritt 2: UISearchBar jetzt im Bearbeitungsmodus. Suchbegriff eingegeben Die Schaltfläche "Abbrechen" wird von rechts eingefügt und die Schaltfläche "Löschen" (graues x) wird angezeigt.

Step 2 http://i45.tinypic.com/161kbvp.png

Spotify Schritt 3: Taste Abbrechen gedrückt; Die Tastatur wird ausgefahren und die Suchleiste befindet sich nicht mehr im Bearbeitungsmodus. Der Suchbegriff bleibt bestehen und die graue Schaltfläche ist nun ausgeblendet.

Step 3 http://i46.tinypic.com/20utv9v.png

Derzeit feuert den folgenden Code aus, wenn meine Abbrechen-Taste gedrückt wird:

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { 
    [searchBar resignFirstResponder]; 
    [searchBar setShowsCancelButton:NO animated:YES]; 
} 

was zur Folge hat: jetzt Suchleiste:

Mein Schritt 3 nicht im Bearbeitungsmodus. Abbrechen-Taste und Tastatur ist herausgerutscht. Der Suchbegriff bleibt, aber auch das graue x.

Problem http://i46.tinypic.com/rlm4w5.png

So ist meine Frage: Da -resignFirstResponder (und -endEditing:, FYI) tut nicht die graue x-Taste ausgeblendet, wenn eine Suchleiste Text in sie eingegeben hatte, wie kann man verstecken ?

Nochmals vielen Dank, Freunde.

Antwort

29

Das Problem besteht darin, dass UISearchBar sein Textfeld nicht verfügbar macht und die Eigenschaften im Textfeld selbst verwaltet. Manchmal sind die Werte der Eigenschaften nicht was Sie wollen.

Zum Beispiel wollte ich in meiner eigenen App, dass der Tastaturstil für meine Suchleiste den transparenten Alarmstil verwendet.

Meine Lösung war, durch die Unteransichten der Suchleiste zu gehen, bis Sie das Textfeld finden. Sie sollten dann in der Lage sein, die clearButtonMode -Eigenschaft zu setzen, mit etwas wie UITextFieldViewModeWhileEditing als Parameter.

Dies sollte dazu führen, dass die Schaltfläche zum Löschen nur während der Bearbeitung des Textfelds angezeigt wird.

Sie möchten dies auf viewDidLoad oder etwas früh tun, so ist es eingestellt, bevor Sie es verwenden (aber nachdem der Suchbalken initialisiert wird.

for (UIView *subview in searchBar.subviews) 
{ 
    if ([subview conformsToProtocol:@protocol(UITextInputTraits)]) 
    { 
     [(UITextField *)subview setClearButtonMode:UITextFieldViewModeWhileEditing]; 
    } 
} 
+1

Prost Jasarien, dies genau zu sein scheint, was Ich brauche. Leider läuft ein Fehler mit '[subview conformsToProtocol: UITextInputTraits]', das lautet: 'erwarteter Ausdruck vor 'UITextInputTraits''. Muss ich irgendetwas importieren oder anpassen? –

+2

Mein schlechtes! Es tut uns leid. Sie müssen tun '[Subview ConformsToProtocol: @protocol (UITextInputTraits)]' – Jasarien

+0

Das ist es! Du bist ein Genie. Danke Kumpel. –

3

Um auf Jadariens Antwort zu erweitern, wenn Sie nie die grauen x Sie Folgendes

for (UIView *subview in searchBar.subviews) 
{ 
    if ([subview conformsToProtocol:@protocol(UITextInputTraits)]) 
    { 
     [(UITextField *)subview setClearButtonMode:UITextFieldViewModeNever]; 
    } 
} 
6

Sieht aus wie iOS 7 die Ansicht Hierarchie von UISearchBar geändert, und das Textfeld verwenden müssen, erscheinen tiefer in der Sicht (Die obige Lösung hat bei mir nicht funktioniert). Um jedoch die obige Lösung zu modifizieren die gesamte Hierarchie zu durchqueren funktioniert:

[self configureSearchBarView:[self searchBar]]; 

- (void)configureSearchBarView:(UIView*)view { 
    for (UIView *subview in [view subviews]){ 
     [self configureSearchBarView:subview]; 
    } 
    if ([view conformsToProtocol:@protocol(UITextInputTraits)]) { 
     [(UITextField *)view setClearButtonMode:UITextFieldViewModeWhileEditing]; 
    } 
} 
+0

Dies könnte leicht zu einer Kategorie in UISearchBar gemacht werden, um die Wiederverwendung zu ermöglichen. – ABeanSits

+3

Scheint einen Absturz zu verursachen, anscheinend gibt es mehr als eine Ansicht, die mit 'UITextInputTraits' übereinstimmt und diese Ansicht kann nicht auf' setClearButtonMode' reagieren. – Mackey18

+0

Um den Absturz zu verhindern, habe ich es so geändert: 'for (UIView * Unteransicht in [self.searchDisplayController.searchBar Unteransichten]) {[self configureSearchBarView: Unteransicht];} gefolgt von der' configureSearchBarView: (UIView *) view' Methode . Scheint, dass in meinem Fall die searchBar selbst den Absturz verursacht hat. – Mackey18

6

Ich bin auf die früheren Antworten zu bauen, weil ich sehen, stürzt auf iOS 7.1 gestartet, es sei denn ich die folgende Änderung vorgenommen hat. Ich fügte einen zusätzlichen Anruf zu respondsToSelector für jede Ansicht hinzu, um sicherzustellen, dass setClearButtonMode: aufgerufen werden kann. Ich beobachtete eine Instanz von UISearchBar bekommen übergeben, die mit dem UITextInputTraits Protokoll zu entsprechen scheint noch nicht die setClearButtonMode: Selektor, so dass ein Absturz aufgetreten ist. Eine Instanz von UISearchBarTextField wird ebenfalls übergeben und ist das tatsächliche Objekt, für das setClearButtonMode: aufgerufen werden soll.

 
- (void)removeClearButtonFromView:(UIView *)view 
{ 
    if (!view) 
    { 
     return; 
    } 

    for (UIView *subview in view.subviews) 
    { 
     [self removeClearButtonFromView:subview]; 
    } 

    if ([view conformsToProtocol:@protocol(UITextInputTraits)]) 
    { 
     UITextField *textView = (UITextField *)view; 
     if ([textView respondsToSelector:@selector(setClearButtonMode:)]) 
     { 
      [textView setClearButtonMode:UITextFieldViewModeNever]; 
     } 
    } 
} 
+0

Beste Lösung! Vielen Dank. –

+0

In der Tat funktioniert dieses am reibungslosesten mit iOS 7. –

4

Ein besserer Weg, dies in iOS7 zu tun ist:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setClearButtonMode:UITextFieldViewModeWhileEditing];

0

Hers ist eine Kategorie, schrieb ich, dass dieses

Kategorie

@implementation UISearchBar (Additions) 

- (void)setClearButtonMode:(UITextFieldViewMode)viewMode { 
    UITextField *textField = [self findTextFieldInView:self]; 
    [textField setClearButtonMode:viewMode]; 
} 

- (UITextField *)findTextFieldInView:(UIView *)view { 

    for (UIView *subview in view.subviews) { 

     if ([subview isKindOfClass:[UITextField class]] || 
      [subview.class isSubclassOfClass:[UITextField class]]) { 

      return (UITextField *)subview; 
     } 

     UITextField *textField = [self findTextFieldInView:subview]; 

     if (textField) { 
      return textField; 
     } 
    } 

    return nil; 
} 

@end 

Usage

tut
[searchBar setClearButtonMode:UITextFieldViewModeWhileEditing]; 
4

Sie müssen das Textfeld der Suchleiste

UITextField *textField = [searchBar valueForKey:@"_searchField"]; 
textField.clearButtonMode = UITextFieldViewModeNever; 

Einsatz bekommen - (void) searchBarTextDidBeginEditing: (UISearchBar *) SearchBar Methode.

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 
{ 

UITextField *textField = [searchBar valueForKey:@"_searchField"]; 
textField.clearButtonMode = UITextFieldViewModeNever; 


} 
0

Es gibt einen besseren Weg, als eine der Antworten hier, und Sie haben keine privaten APIs oder Traverse Subviews verwenden, um es zu tun.

UISearchBar verfügt über eine eingebaute API für dies zu tun:

[UISearchBar setImage:forSearchBarIcon:state]

Das SearchBar Icontaste Sie wollen, ist UISearchBarIconClear, und Sie möchten die UIControlStateNormal Zustand. Dann gib ihm ein klares Bild für das Bild, und du bist fertig.

So sollte es so aussehen:

[searchBar setImage:clearImage forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal]; 
0

Für die (x) Symbol in SearchBar. Sie können die untergeordnete Methode verwenden.

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 
{ 
    searchBar.showsCancelButton = YES; 
} 
0
for (UIView *subview in _search_bar.subviews) 
{ 
    NSLog(@"%@",subview.subviews); 

    for (UIView *subview11 in subview.subviews) 
    { 
     if ([subview11 conformsToProtocol:@protocol(UITextInputTraits)]) 
     { 
      [(UITextField *)subview11 setClearButtonMode:UITextFieldViewModeNever]; 
     } 
    } 

} 
1

akzeptierte Antwort nicht auf iOS7 + funktioniert, hier ist die modifizierte Version als Swift Erweiterung

extension UIView { 
    class func removeClearButton(svs: [UIView]) { 
     for sv in svs { 
      if let tv = sv as? UITextField where sv.conformsToProtocol(UITextInputTraits) { 
       tv.clearButtonMode = .Never 
       return 
      } else { 
       UIView.removeClearButton(sv.subviews) 
      } 
     } 
    } 
} 

Nutzungs

UIView.removeClearButton(searchBar.subviews) 
Verwandte Themen