2014-09-18 17 views
8

Die Dokumentation für UISearchController besagt, dass Sie - searchBar überschreiben können, um eine benutzerdefinierte Unterklasse von UISearchBar für den Controller zu verwenden. Die benutzerdefinierte Suchleiste wird verwendet und ihre eigenen Delegate-Methoden werden korrekt aufgerufen, aber die Methode UISearchResultsUpdating wird nicht mehr aufgerufen, wenn sich die Suchleiste ändert. Muss ich viele Dinge manuell erledigen, oder fehlt mir etwas, damit sich der Controller verhält wie bei einer nativen Suchleiste?Benutzerdefinierte UISearchBar mit UISearchController

+0

Nichts darin verwendet einen Unterklasse UISearchController, die ich sehen kann – farski

+0

Gab es Updates zu diesem Problem? Ich kämpfe mit dem gleichen. Ich benutze benutzerdefinierte 'UISearchBar' und' UISearchController', um zu vermeiden, dass die Abbrechen-Schaltfläche angezeigt wird. "UISearchResultsUpdating" wird jetzt nicht bei Änderungen des Suchtextes aufgerufen, und daher wird die Ergebnistabelle überhaupt nicht angezeigt. – artooras

Antwort

3

Dies ist ein bekannter Fehler. Leider gibt es keine Problemumgehung, die keine private API umfasst.

+0

Können Sie das näher ausführen? Ich kann dieses Problem nicht als einen bekannten Fehler bezeichnen. – pbuchheit

+0

@Alex UISearchController ist nur in iOS 8 und höher verfügbar. Der Compiler erkennt die Klasse in iOS 7 und darunter nicht. Bleiben Sie bei UISearchDisplayController, bis Sie nur iOS 8 und höher unterstützen. –

+0

@MyztikJenz, wissen Sie, ob es irgendwelche Änderungen in Bezug auf diesen Fehler gab? Mein Problem ist, dass die Suchergebnistabelle nicht vollständig angezeigt wird, da 'UISearchResultsUpdating' nicht bei Suchtextänderungen mit einer benutzerdefinierten' UISearchBar' aufgerufen wird. – artooras

0

Ich denke, es soll sich so verhalten.

Dies ist von UISearchController.h

// You are free to become the search bar's delegate to monitor for text changes and button presses. 
@property (nonatomic, retain, readonly) UISearchBar *searchBar; 

dass alle Delegatmethode (updateSearchResultsForSearchController :) tut, ist Ihre Suche Controller zurückzukehren und seine Suchleiste zugreifen können.

Sie können dies einfach über Ihre benutzerdefinierten Suchleiste Delegate Methoden tun.

2

Wenn Sie UISearchController ableiten, können Sie UISearchBar in Getter anpassen (Setter existiert nicht).

Beispiel - in der Unterklasse Implementierung:

-(UISearchBar*)searchBar{ 
    UISearchBar *baseSearchBar = [super searchBar]; 
    if (baseSearchBar.showsScopeBar) { 
     baseSearchBar.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 88); 
    }else{ 
     baseSearchBar.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 44); 
    } 
    return baseSearchBar; 
} 

Hope this jemand hilft.

+0

Aber es hat mir sehr geholfen. –

3

Aufschalten der SearchBar Getter in Ihrer benutzerdefinierten UISearchController Klasse, es Ihre benutzerdefinierten SearchBar zurückkehren müssen und es haben bereits initialisiert werden, dann sind Sie Setup seine Eigenschaften erst nach dem UISearchController init, auf diese Weise die alle UISearchController Funktionalität beibehalten:

public class DSearchController: UISearchController { 

    private var customSearchBar = DSearchBar() 
    override public var searchBar: UISearchBar { 
     get { 
      return customSearchBar 
     } 
    } 

    required public init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
    } 
    public init(searchResultsController: UIViewController?, 
       searchResultsUpdater: UISearchResultsUpdating?, 
       delegate: UISearchControllerDelegate?, 
       dimsBackgroundDuringPresentation: Bool, 
       hidesNavigationBarDuringPresentation: Bool, 
       searchBarDelegate: UISearchBarDelegate?, 
       searchBarFrame: CGRect?, 
       searchBarStyle: UISearchBarStyle, 
       searchBarPlaceHolder: String, 
       searchBarFont: UIFont?, 
       searchBarTextColor: UIColor?, 
       searchBarBarTintColor: UIColor?, // Bar background 
       searchBarTintColor: UIColor) { // Cursor and bottom line 

     super.init(searchResultsController: searchResultsController) 

     self.searchResultsUpdater = searchResultsUpdater 
     self.delegate = delegate 
     self.dimsBackgroundDuringPresentation = dimsBackgroundDuringPresentation 
     self.hidesNavigationBarDuringPresentation = hidesNavigationBarDuringPresentation   

     customSearchBar.setUp(searchBarDelegate, 
           frame: searchBarFrame, 
           barStyle: searchBarStyle, 
           placeholder: searchBarPlaceHolder, 
           font: searchBarFont, 
           textColor: searchBarTextColor, 
           barTintColor: searchBarBarTintColor, 
           tintColor: searchBarTintColor) 

    } 
} 

Und das ist meine Gewohnheit SearchBar:

public class DSearchBar: UISearchBar { 

    var preferredFont: UIFont? 
    var preferredTextColor: UIColor? 

    init(){ 
     super.init(frame: CGRect.zero) 
    } 

    func setUp(delegate: UISearchBarDelegate?, 
       frame: CGRect?, 
       barStyle: UISearchBarStyle, 
       placeholder: String, 
       font: UIFont?, 
       textColor: UIColor?, 
       barTintColor: UIColor?, 
       tintColor: UIColor?) { 

     self.delegate = delegate 
     self.frame = frame ?? self.frame 
     self.searchBarStyle = searchBarStyle 
     self.placeholder = placeholder 
     self.preferredFont = font 
     self.preferredTextColor = textColor 
     self.barTintColor = barTintColor ?? self.barTintColor 
     self.tintColor = tintColor ?? self.tintColor 
     self.bottomLineColor = tintColor ?? UIColor.clearColor() 

     sizeToFit() 

     //  translucent = false 
     //  showsBookmarkButton = false 
     //  showsCancelButton = true 
     //  setShowsCancelButton(false, animated: false) 
     //  customSearchBar.backgroundImage = UIImage() 
    } 

    required public init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 


    let bottomLine = CAShapeLayer() 
    var bottomLineColor = UIColor.clearColor() 

    override public func layoutSubviews() { 
     super.layoutSubviews() 

     for view in subviews { 
      if let searchField = view as? UITextField { setSearchFieldAppearance(searchField); break } 
      else { 
       for sView in view.subviews { 
        if let searchField = sView as? UITextField { setSearchFieldAppearance(searchField); break } 
       } 
      } 
     } 

     bottomLine.path = UIBezierPath(rect: CGRectMake(0.0, frame.size.height - 1, frame.size.width, 1.0)).CGPath 
     bottomLine.fillColor = bottomLineColor.CGColor 
     layer.addSublayer(bottomLine) 
    } 

    func setSearchFieldAppearance(searchField: UITextField) { 
     searchField.frame = CGRectMake(5.0, 5.0, frame.size.width - 10.0, frame.size.height - 10.0) 
     searchField.font = preferredFont ?? searchField.font 
     searchField.textColor = preferredTextColor ?? searchField.textColor 
     //searchField.backgroundColor = UIColor.clearColor() 
     //backgroundImage = UIImage() 
    } 

} 

Init Beispiel:

searchController = DSearchController(searchResultsController: ls, 
            searchResultsUpdater: self, 
            delegate: self, 
            dimsBackgroundDuringPresentation: true, 
            hidesNavigationBarDuringPresentation: true, 
            searchBarDelegate: ls, 
            searchBarFrame: CGRectMake(0.0, 0.0, SCREEN_WIDTH, 44.0), 
            searchBarStyle: .Minimal, 
            searchBarPlaceHolder: NSLocalizedString("Search a location...", comment: ""), 
            searchBarFont: nil, 
            searchBarTextColor: nil, 
            searchBarBarTintColor: UIColor.whiteColor(), 
            searchBarTintColor: iconsColor) 
searchController.searchBar.keyboardAppearance = .Dark 
definesPresentationContext = true 
tableView.tableHeaderView = searchController.searchBar 
Verwandte Themen