Frage

Ich habe eine UISearchBar in eine Tabellenansicht implementiert und fast alles funktioniert, außer einer Kleinigkeit: Wenn ich einen Text eingeben und drücken Sie dann die Suchtaste auf der Tastatur, die Tastatur weggeht, werden die Suchergebnisse der einzigen Elemente gezeigt in der Tisch, der Text bleibt in der UISearchBar, aber die abbrechen-Taste deaktiviert wird.

Ich habe versucht, meine Liste so nah an die Funktionalität des Apple-Kontakte App zu bekommen, und wenn Sie in dieser Anwendung suchen drückt, ist es nicht deaktivieren Sie die Taste.

Als ich in der UISearchBar Header-Datei sah, bemerkte ich eine Fahne für autoDisableCancelButton unter der _searchBarFlags Struktur, aber es ist privat.

Gibt es etwas, dass ich vermisst, wenn ich Setup die UISearchBar?

War es hilfreich?

Lösung

ich eine Lösung gefunden. Sie können über die Subviews der Suchleiste verwenden, um dies zu Schleife for-Schleife und es ermöglichen, wenn die Suchtaste auf der Tastatur gedrückt wird.

for (UIView *possibleButton in searchBar.subviews)
{
    if ([possibleButton isKindOfClass:[UIButton class]])
    {
        UIButton *cancelButton = (UIButton*)possibleButton;
        cancelButton.enabled = YES;
        break;
    }
}

Andere Tipps

Ich hatte dies ein wenig zwicken, um es in iOS7 für mich zu bekommen arbeiten

- (void)enableCancelButton:(UISearchBar *)searchBar
{
    for (UIView *view in searchBar.subviews)
    {
        for (id subview in view.subviews)
        {
            if ( [subview isKindOfClass:[UIButton class]] )
            {
                [subview setEnabled:YES];
                NSLog(@"enableCancelButton");
                return;
            }
        }
    }
}

Es gibt zwei Wege dies leicht zu erreichen

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
    //  The small and dirty
    [(UIButton*)[searchBar valueForKey:@"_cancelButton"] setEnabled:YES];

    // The long and safe
     UIButton *cancelButton = [searchBar valueForKey:@"_cancelButton"];
    if ([cancelButton respondsToSelector:@selector(setEnabled:)]) {
         cancelButton.enabled = YES;
    }
}

Sie sollten mit dem zweiten gehen, wird es nicht Ihre Anwendung abstürzen, wenn Apple es im Hintergrund ändern.

BTW getestet ich es von iOS 4,0-8,2 und keine Änderungen, verwende ich es auch in meinem Speicher genehmigten Antrag ohne Probleme.

Dies ist, was es an der Arbeit auf iOS 6 für mich gemacht:

searchBar.showsCancelButton = YES;
searchBar.showsScopeBar = YES;
[searchBar sizeToFit];
[searchBar setShowsCancelButton:YES animated:YES];

Hier ist meine Lösung, die für alle Situationen, in allen Versionen von iOS funktioniert.

IE, andere Lösungen nicht behandeln, wenn die Tastatur entlassen wird, weil der Benutzer eine Scroll-Ansicht gezogen.

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

// This will handle whenever the text field is resigned non-programatically
// (IE, because it's set to resign when the scroll view is dragged in your storyboard.)
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
    [self performSelector:@selector(enableCancelButton:) withObject:searchBar afterDelay:0.001];
}

// Also follow up every [searchBar resignFirstResponder];
// with [self enableCancelButton:searchBar];

Keine der Antworten war für mich überhaupt nicht. Ich bin Targeting iOS 7. Aber ich fand eine Antwort.

Was ich versuche ist so etwas wie das Twitter-App für iOS. Wenn Sie auf die Lupe in der Registerkarte Zeitleisten klicken, werden die UISearchBar erscheint mit der Abbruch-Taste aktiviert, die Tastatur zeigt, und die letzten Suchbild. Blättern Sie die aktuellen Suchanfragen Bildschirm und blendet die Tastatur, aber es hält die aktivierte Abbrechen-Taste.

Das ist mein Arbeits Code:

UIView *searchBarSubview = self.searchBar.subviews[0];
NSArray *subviewCache = [searchBarSubview valueForKeyPath:@"subviewCache"];
if ([subviewCache[2] respondsToSelector:@selector(setEnabled:)]) {
    [subviewCache[2] setValue:@YES forKeyPath:@"enabled"];
}

Ich kam diese Lösung bei durch einen Haltepunkt an meinem Tisch Ansicht der scrollViewWillBeginDragging: Einstellung. Ich sah mir in die UISearchBar und entblößte seine Subviews. Es hat immer nur eine, die vom Typ UIView ist (mein Variable searchBarSubview).

eingeben Bild Beschreibung hier

Dann gilt, dass UIView eine NSArray genannt subviewCache und ich bemerkte, dass das letzte Element, das die dritte ist, vom Typ UINavigationButton ist, nicht in der Öffentlichkeit API. Also habe ich stattdessen Codierung zu verwenden Schlüssel-Wert aus. Ich geprüft, ob der UINavigationButton auf setEnabled: reagiert, und zum Glück, es tut. Also habe ich die Eigenschaft @YES. aus Turns, dass dieser UINavigationButton is die Abbrechen-Taste.

Dies gebunden zu brechen, wenn Apple die Einführung eines UISearchBar Innereien ändern entscheidet, aber was zum Teufel. Es funktioniert jetzt.

Wie pro meine Antwort hier , legen Sie diese in Ihrem SearchBar delegieren:

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{   
    dispatch_async(dispatch_get_main_queue(), ^{
        __block __weak void (^weakEnsureCancelButtonRemainsEnabled)(UIView *);
        void (^ensureCancelButtonRemainsEnabled)(UIView *);
        weakEnsureCancelButtonRemainsEnabled = ensureCancelButtonRemainsEnabled = ^(UIView *view) {
            for (UIView *subview in view.subviews) {
                if ([subview isKindOfClass:[UIControl class]]) {
                    [(UIControl *)subview setEnabled:YES];
                }
                weakEnsureCancelButtonRemainsEnabled(subview);
            }
        };

        ensureCancelButtonRemainsEnabled(searchBar);
    });
}

Für Monotouch oder Xamarin iOS Ich habe folgende C # Lösung für iOS arbeiten 7 und iOS 8:

foreach(UIView view in searchBar.Subviews)
{
    foreach(var subview in view.Subviews)
    {
        //Console.WriteLine(subview.GetType());
        if(subview.GetType() == typeof(UIButton))
        {
            if(subview.RespondsToSelector(new Selector("setEnabled:")))
            {
                UIButton cancelButton = (UIButton)subview;
                cancelButton.Enabled = true;
                Console.WriteLine("enabledCancelButton");
                return;
            }
        }
    }
}

Diese Antwort basiert auf David Douglas Lösung.

Eine vollständigere Antwort:

  • seit iOS 7, gibt es eine zusätzliche Ebene von Subviews unter dem SearchBar
  • ein guter Ort, die Löschtaste ist in searchBarTextDidEndEditing
  • aktivieren

.

extension MyController: UISearchBarDelegate {
  public func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
    DispatchQueue.main.async {
    // you need that since the disabling will
    // happen after searchBarTextDidEndEditing is called
      searchBar.subviews.forEach({ view in
        view.subviews.forEach({ subview in
          // ios 7+
          if let cancelButton = subview as? UIButton {
            cancelButton.isEnabled = true
            cancelButton.isUserInteractionEnabled = true
            return
          }
        })
        // ios 7-
        if let cancelButton = subview as? UIButton {
          cancelButton.isEnabled = true
          cancelButton.isUserInteractionEnabled = true
          return
        }
      })
    }
  }
}

Hier ist ein Swift 3-Lösung, dass Marken-Erweiterungen verwenden einfach die Löschtaste zu bekommen:

extension UISearchBar {
    var cancelButton: UIButton? {
        for subView1 in subviews {
            for subView2 in subView1.subviews {
                if let cancelButton = subView2 as? UIButton {
                    return cancelButton
                }
            }
        }
        return nil
    }
}

Jetzt für die Nutzung:

class MyTableViewController : UITableViewController, UISearchBarDelegate {

    var searchBar = UISearchBar()

    func viewDidLoad() {
        super.viewDidLoad()
        searchBar.delegate = self
        tableView.tableHeaderView = searchBar
    }

    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
        DispatchQueue.main.async {
            if let cancelButton = searchBar.cancelButton {
                cancelButton.isEnabled = true
                cancelButton.isUserInteractionEnabled = true
            }
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top